import Vapor func routes(_ app: Application) throws { let cfg = app.serviceConfig // POST /config app.post("config") { req -> ServiceConfig in req.logger.info("🔄 Received POST /config") return cfg } // GET /issue/.well-known/private-token-issuer-directory app.get("issue", ".well-known", "private-token-issuer-directory") { req -> Response in req.logger.info("🔍 GET /.well-known/private-token-issuer-directory") let directory = IssuerDirectory( issuerRequestUri: req.application.serviceConfig.issuerRequestUri, tokenKeys: req.application.serviceConfig.tokenKeys ) let res = Response(status: .ok) try res.content.encode(directory) res.headers.replaceOrAdd( name: .contentType, value: "application/private-token-issuer-directory" ) res.headers.replaceOrAdd( name: .cacheControl, value: "public, max-age=3600" ) return res } // POST /issue app.post("issue") { req -> [String:String] in req.logger.info("💳 POST /issue") let token = cfg.users.first?.tokens.first ?? "" return ["token": token] } // GET /issue/token-key-for-user-token app.get("issue", "token-key-for-user-token") { req -> Response in req.logger.info("🔑 GET /issue/token-key-for-user-token") guard let keyEntry = cfg.tokenKeys.first else { throw Abort(.notFound) } let b64url = keyEntry.tokenKey let b64 = b64url .replacingOccurrences(of: "-", with: "+") .replacingOccurrences(of: "_", with: "/") let padLen = (4 - b64.count % 4) % 4 let padded = b64 + String(repeating: "=", count: padLen) // 3. Decodifica para bytes DER guard let derData = Data(base64Encoded: padded) else { throw Abort(.internalServerError, reason: "Invalid public key format") } req.logger.info("🔑 SPKI DER length: \(derData.count) bytes") let prefixHex = derData.prefix(8).map { String(format: "%02x", $0) }.joined(separator: " ") req.logger.info("🔑 SPKI DER prefix: \(prefixHex)") let res = Response(status: .ok) res.body = .init(data: derData) res.headers.replaceOrAdd(name: .contentType, value: "application/octet-stream") res.headers.replaceOrAdd(name: .cacheControl, value: "public, max-age=3600") return res } app.post("queries") { req -> QueryResponse in req.logger.info("📬 POST /queries") let entry = LookupEntry(phoneNumber: "+5511111111111", label: "TestContact") let response = QueryResponse(results: [entry]) return response } }