85 lines
2.5 KiB
Swift
85 lines
2.5 KiB
Swift
import Vapor
|
|
import Fluent
|
|
import SwiftMsgpack
|
|
import JWT
|
|
|
|
struct ToolController: RouteCollection {
|
|
func boot(routes: any RoutesBuilder) throws {
|
|
let group = routes.grouped("tool")
|
|
group.post("signup", use: self.signup)
|
|
|
|
}
|
|
|
|
@Sendable
|
|
func signup(req: Request) async throws -> Response {
|
|
let body = try req.content.decode(SignupReq.self, using: MsgPackDecoder())
|
|
|
|
guard let udid = req.headers["udid"].first else {
|
|
throw Abort(.badRequest)
|
|
}
|
|
|
|
guard
|
|
let session = try await Session.query(on: req.db).filter(\.$id == body.access_token).first(),
|
|
session.type == SessionType.ZAT
|
|
else {
|
|
throw Abort(.forbidden, reason: "Invalid access token")
|
|
}
|
|
let accountId = session.$account.id
|
|
|
|
if try await Player.query(on: req.db).filter(\.$account.$id == accountId).first() == nil {
|
|
guard let account = try await Account.query(on: req.db).filter(\.$id == accountId).first() else {
|
|
throw Abort(.forbidden, reason: "Account ID does not exist")
|
|
}
|
|
// Create new Player
|
|
let player = try Player.createDefault(account: account)
|
|
try await player.save(on: req.db)
|
|
}
|
|
|
|
let viewerSession = try await Session.query(on: req.db)
|
|
.filter(\.$account.$id == accountId)
|
|
.filter(\.$type == .VIEWER)
|
|
.first() ?? Session(accountId: accountId, expires: Date.now, type: .VIEWER)
|
|
|
|
if (viewerSession.hasChanges) {
|
|
try await viewerSession.save(on: req.db)
|
|
}
|
|
let response = Response(status:.ok)
|
|
|
|
try response.content.encode(SignupRes(
|
|
data_headers: DataHeadersRes(
|
|
short_udid: 0,
|
|
viewer_id: Int(try viewerSession.requireID())!,
|
|
udid: udid,
|
|
servertime: Int(Date.now.timeIntervalSince1970 * 100),
|
|
result_code: 1
|
|
),
|
|
data: []
|
|
), using: MsgPackEncoder())
|
|
|
|
return response
|
|
}
|
|
}
|
|
|
|
struct SignupReq: Content {
|
|
let app_secret: String
|
|
let access_token: String
|
|
let storage_directory_path: String
|
|
let app_admin: String
|
|
let kakao_pid: String
|
|
let device_id: Double
|
|
let idp_code: String
|
|
}
|
|
|
|
struct DataHeadersRes: Content {
|
|
let short_udid: Int
|
|
let viewer_id: Int
|
|
let udid: String
|
|
let servertime: Int
|
|
let result_code: Int
|
|
}
|
|
|
|
struct SignupRes: Content {
|
|
let data_headers: DataHeadersRes
|
|
let data: [String]
|
|
}
|