feat: add MastodonAPI

This commit is contained in:
sunxiaojian 2021-01-26 17:38:30 +08:00
parent 19ddb106ad
commit 3d5afbd589
9 changed files with 201 additions and 7 deletions

View File

@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */
3533495136D843E85211E3E2 /* Pods_Mastodon_MastodonUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1B4523A7981F1044DE89C21 /* Pods_Mastodon_MastodonUITests.framework */; };
5D526FE225BE9AC400460CB9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 5D526FE125BE9AC400460CB9 /* MastodonSDK */; };
5E44BF88AD33646E64727BCF /* Pods_MastodonTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD92E0F10BDE4FE7C4B999F2 /* Pods_MastodonTests.framework */; };
7A9135D4559750AF07CA9BE4 /* Pods_Mastodon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 602D783BEC22881EBAD84419 /* Pods_Mastodon.framework */; };
DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3D0FF225BAA61700EAA174 /* AlamofireImage */; };
@ -76,6 +77,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5D526FE225BE9AC400460CB9 /* MastodonSDK in Frameworks */,
7A9135D4559750AF07CA9BE4 /* Pods_Mastodon.framework in Frameworks */,
DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */,
);
@ -226,6 +228,7 @@
name = Mastodon;
packageProductDependencies = (
DB3D0FF225BAA61700EAA174 /* AlamofireImage */,
5D526FE125BE9AC400460CB9 /* MastodonSDK */,
);
productName = Mastodon;
productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */;
@ -830,6 +833,10 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
5D526FE125BE9AC400460CB9 /* MastodonSDK */ = {
isa = XCSwiftPackageProductDependency;
productName = MastodonSDK;
};
DB3D0FF225BAA61700EAA174 /* AlamofireImage */ = {
isa = XCSwiftPackageProductDependency;
package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */;

View File

@ -18,6 +18,33 @@
"revision": "3e8edbeb75227f8542aa87f90240cf0424d6362f",
"version": "4.1.0"
}
},
{
"package": "swift-nio",
"repositoryURL": "https://github.com/apple/swift-nio.git",
"state": {
"branch": null,
"revision": "8da5c5a4e6c5084c296b9f39dc54f00be146e0fa",
"version": "1.14.2"
}
},
{
"package": "swift-nio-zlib-support",
"repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git",
"state": {
"branch": null,
"revision": "37760e9a52030bb9011972c5213c3350fa9d41fd",
"version": "1.0.0"
}
},
{
"package": "SwiftyJSON",
"repositoryURL": "https://github.com/SwiftyJSON/SwiftyJSON.git",
"state": {
"branch": null,
"revision": "2b6054efa051565954e1d2b9da831680026cd768",
"version": "5.0.0"
}
}
]
},

View File

@ -6,11 +6,13 @@
//
import UIKit
import MastodonSDK
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}

View File

@ -14,15 +14,18 @@ let package = Package(
targets: ["MastodonSDK"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", from: "5.0.0"),
.package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "MastodonSDK",
dependencies: []
dependencies: [
.product(name: "SwiftyJSON", package: "SwiftyJSON"),
.product(name: "NIOHTTP1", package: "swift-nio"),
]
),
.testTarget(
name: "MastodonSDKTests",

View File

@ -0,0 +1,60 @@
//
// Mastodon+API+App.swift
//
//
// Created by xiaojian sun on 2021/1/25.
//
import Combine
import Foundation
public extension Mastodon.API.App {
internal static let appEndpointURL = Mastodon.API.endpointURL.appendingPathComponent("apps")
struct OAuth2Credentials: Codable {
public let id: String
public let name: String
public let website: String?
public let redirectURI: String
public let clientID: String
public let clientSecret: String
public let vapidKey: String
enum CodingKeys: String, CodingKey {
case id
case name
case website
case redirectURI = "redirect_uri"
case clientID = "client_id"
case clientSecret = "client_secret"
case vapidKey = "vapid_key"
}
}
struct registerAppQuery {
public let client_name: String
public let redirect_uris: String
public let scopes: String
public let website: String
public init(client_name: String, redirect_uris: String, scopes: String, website: String) {
self.client_name = client_name
self.redirect_uris = redirect_uris
self.scopes = scopes
self.website = website
}
var queryItems: [URLQueryItem]? {
var items: [URLQueryItem] = []
items.append(URLQueryItem(name: "client_name", value: client_name))
items.append(URLQueryItem(name: "redirect_uris", value: redirect_uris))
items.append(URLQueryItem(name: "scopes", value: scopes))
guard !items.isEmpty else { return nil }
return items
}
}
}
extension Mastodon.API.App.OAuth2Credentials: Equatable {}

View File

@ -0,0 +1,73 @@
//
// Mastodon+API.swift
//
//
// Created by xiaojian sun on 2021/1/25.
//
import Foundation
import NIOHTTP1
public extension Mastodon.API {
static var baseUrl = ""
static let endpointURL = URL(string: baseUrl + "/api/v1/")!
static let timeoutInterval: TimeInterval = 10
static let decoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .MastodonStrategy
return decoder
}()
static let httpHeaderDateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
return formatter
}()
enum App {}
}
extension Mastodon.API {
// Error Response when request V1 endpoint
struct ErrorResponse: Codable {
let errors: [ErrorDescription]
struct ErrorDescription: Codable {
public let code: Int
public let message: String
}
}
// Alternative Error Response when request V1 endpoint
struct ErrorRequestResponse: Codable {
let request: String
let error: String
}
}
extension Mastodon.API {
}
private extension JSONDecoder.DateDecodingStrategy {
static let MastodonStrategy = custom { decoder throws -> Date in
let container = try decoder.singleValueContainer()
let string = try container.decode(String.self)
let formatterV1 = DateFormatter()
formatterV1.locale = Locale(identifier: "en")
formatterV1.dateFormat = "EEE MMM dd HH:mm:ss ZZZZZ yyyy"
if let date = formatterV1.date(from: string) {
return date
}
let formatterV2 = ISO8601DateFormatter()
formatterV2.formatOptions.insert(.withFractionalSeconds)
if let date = formatterV2.date(from: string) {
return date
}
throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid date: \(string)")
}
}

View File

@ -0,0 +1,9 @@
//
// File.swift
//
//
// Created by xiaojian sun on 2021/1/25.
//
import Foundation
extension Mastodon.Entity { }

View File

@ -0,0 +1,15 @@
//
// File.swift
//
//
// Created by xiaojian sun on 2021/1/25.
//
import Foundation
public enum Mastodon {
public enum Request { }
public enum Response { }
public enum API { }
public enum Entity { }
}

View File

@ -1,3 +1 @@
struct MastodonSDK {
var text = "Hello, World!"
}