import Foundation /// `/api/projects` — Pro-only folders. `list()` itself is not gated (a /// downgraded Pro user can still see how their receipts were filed), but /// create/rename/delete return `402 pro_required` for a free-plan account — /// surface that as a paywall prompt, not a generic error. enum ProjectsAPI { static func list() async throws -> [Project] { let response: ProjectListResponse = try await APIClient.shared.send( APIRequest(path: "/api/projects", method: .get) ) return response.projects } @discardableResult static func create(name: String, color: String?) async throws -> Project { struct Response: Decodable { let success: Bool; let project: Project } let request = try APIRequest.json( path: "/api/projects", method: .post, body: CreateProjectRequest(name: name, color: color) ) let response: Response = try await APIClient.shared.send(request) return response.project } static func delete(id: String) async throws { try await APIClient.shared.sendDiscardingResponse( APIRequest(path: "/api/projects/\(id)", method: .delete) ) } }