Skip to content

Instantly share code, notes, and snippets.

@MarcoEidinger
Created August 2, 2022 01:09
Show Gist options
  • Save MarcoEidinger/bc7719a59bb06b495080b0c328e3b9a1 to your computer and use it in GitHub Desktop.
Save MarcoEidinger/bc7719a59bb06b495080b0c328e3b9a1 to your computer and use it in GitHub Desktop.
Example of using GraphQL in Swift
import Foundation
func querySpecificRepositoryWithGraphQLQuery() async throws -> GitHubGraphQLResponse {
let username = "MarcoEidinger"
let pat = "ghp_y___________________"
let base64EncodedCredentials = "\(username):\(pat)".data(using: .utf8)!.base64EncodedString()
var request = URLRequest(url: URL(string: "https://api.github.com/graphql")!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
// `Authorization` header required for GitHub GraphQL API
request.addValue("Basic \(base64EncodedCredentials)", forHTTPHeaderField: "Authorization")
let query =
"""
{
repository(owner: "MarcoEidinger", name: "SwiftPlantUML") {
stargazerCount
nameWithOwner
name
url
releases(orderBy: {direction: ASC, field: CREATED_AT}, last: 1) {
nodes {
isDraft
isLatest
isPrerelease
createdAt
tagName
}
}
refs(
refPrefix: "refs/tags/"
last: 2
orderBy: {field: TAG_COMMIT_DATE, direction: ASC}
) {
edges {
node {
name
target {
... on Commit {
committedDate
}
... on Tag {
tagger {
date
}
}
}
}
}
}
}
}
"""
let payload = Payload(query: query)
let postData = try! JSONEncoder().encode(payload)
request.httpBody = postData
let response = try await URLSession.shared.data(for: request)
// GitHub returns dates according to the ISO 8601 standard so let's use the appropiate stragegy. Otherwise the decoding will fail and an error gets thrown
let jsonDecoder = JSONDecoder()
jsonDecoder.dateDecodingStrategy = .iso8601
let jsonData = response.0
// Decode to the generated types by quicktype.io
let gitHubGraphQLResponse = try jsonDecoder.decode(GitHubGraphQLResponse.self, from: jsonData)
return gitHubGraphQLResponse
}
// This file was generated from JSON Schema using quicktype, do not modify it directly.
// To parse the JSON, add this file to your project and do:
//
// let gitHubGraphQLResponse = try? newJSONDecoder().decode(GitHubGraphQLResponse.self, from: jsonData)
import Foundation
// MARK: - GitHubGraphQLResponse
struct GitHubGraphQLResponse: Codable {
var data: DataClass?
}
// MARK: - DataClass
struct DataClass: Codable {
var repository: Repository?
}
// MARK: - Repository
struct Repository: Codable {
var stargazerCount: Int?
var nameWithOwner, name: String?
var url: String?
var releases: Releases?
var refs: Refs?
}
// MARK: - Refs
struct Refs: Codable {
var edges: [Edge]?
}
// MARK: - Edge
struct Edge: Codable {
var node: EdgeNode?
}
// MARK: - EdgeNode
struct EdgeNode: Codable {
var name: String?
var target: Target?
}
// MARK: - Target
struct Target: Codable {
var committedDate: Date?
let tagger: Tagger?
}
// MARK: - Tagger
struct Tagger: Codable {
let date: Date?
}
// MARK: - Releases
struct Releases: Codable {
var nodes: [NodeElement]?
}
// MARK: - NodeElement
struct NodeElement: Codable {
var isDraft, isLatest, isPrerelease: Bool?
var createdAt: Date?
var tagName: String?
}
struct Payload: Codable {
var variables: String = "{}"
var query: String
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment