271 lines
5.7 KiB
Swift
271 lines
5.7 KiB
Swift
import CasePathsCore
|
|
import Foundation
|
|
@preconcurrency import URLRouting
|
|
|
|
extension SiteRoute {
|
|
/// Represents api routes.
|
|
///
|
|
/// The routes return json as opposed to view routes that return html.
|
|
public enum Api: Sendable, Equatable {
|
|
|
|
case project(Self.ProjectRoute)
|
|
case room(Self.RoomRoute)
|
|
case equipment(Self.EquipmentRoute)
|
|
case componentLoss(Self.ComponentLossRoute)
|
|
|
|
public static let rootPath = Path {
|
|
"api"
|
|
"v1"
|
|
}
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.project)) {
|
|
rootPath
|
|
ProjectRoute.router
|
|
}
|
|
Route(.case(Self.room)) {
|
|
rootPath
|
|
RoomRoute.router
|
|
}
|
|
Route(.case(Self.equipment)) {
|
|
rootPath
|
|
EquipmentRoute.router
|
|
}
|
|
Route(.case(Self.componentLoss)) {
|
|
rootPath
|
|
ComponentLossRoute.router
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extension SiteRoute.Api {
|
|
public enum ProjectRoute: Sendable, Equatable {
|
|
case create(Project.Create)
|
|
case delete(id: Project.ID)
|
|
case detail(id: Project.ID, route: DetailRoute)
|
|
case get(id: Project.ID)
|
|
case index
|
|
|
|
static let rootPath = "projects"
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.create)) {
|
|
Path { rootPath }
|
|
Method.post
|
|
Body(.json(Project.Create.self))
|
|
}
|
|
Route(.case(Self.delete(id:))) {
|
|
Path {
|
|
rootPath
|
|
Project.ID.parser()
|
|
}
|
|
Method.delete
|
|
}
|
|
Route(.case(Self.get(id:))) {
|
|
Path {
|
|
rootPath
|
|
Project.ID.parser()
|
|
}
|
|
Method.get
|
|
}
|
|
Route(.case(Self.index)) {
|
|
Path { rootPath }
|
|
Method.get
|
|
}
|
|
Route(.case(Self.detail(id:route:))) {
|
|
Path {
|
|
rootPath
|
|
Project.ID.parser()
|
|
}
|
|
DetailRoute.router
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.Api.ProjectRoute {
|
|
public enum DetailRoute: Equatable, Sendable {
|
|
case index
|
|
case completedSteps
|
|
|
|
static let rootPath = "details"
|
|
|
|
static let router = OneOf {
|
|
Route(.case(Self.index)) {
|
|
Path { rootPath }
|
|
Method.get
|
|
}
|
|
Route(.case(Self.completedSteps)) {
|
|
Path {
|
|
rootPath
|
|
"completed"
|
|
}
|
|
Method.get
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.Api {
|
|
|
|
public enum RoomRoute: Sendable, Equatable {
|
|
case create(Room.Create)
|
|
case delete(id: Room.ID)
|
|
case get(id: Room.ID)
|
|
|
|
static let rootPath = "rooms"
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.create)) {
|
|
Path { rootPath }
|
|
Method.post
|
|
Body(.json(Room.Create.self))
|
|
}
|
|
Route(.case(Self.delete(id:))) {
|
|
Path {
|
|
rootPath
|
|
Room.ID.parser()
|
|
}
|
|
Method.delete
|
|
}
|
|
Route(.case(Self.get(id:))) {
|
|
Path {
|
|
rootPath
|
|
Room.ID.parser()
|
|
}
|
|
Method.get
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.Api {
|
|
|
|
public enum EquipmentRoute: Sendable, Equatable {
|
|
case create(EquipmentInfo.Create)
|
|
case delete(id: EquipmentInfo.ID)
|
|
case fetch(projectID: Project.ID)
|
|
case get(id: EquipmentInfo.ID)
|
|
|
|
static let rootPath = "equipment"
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.create)) {
|
|
Path { rootPath }
|
|
Method.post
|
|
Body(.json(EquipmentInfo.Create.self))
|
|
}
|
|
Route(.case(Self.delete(id:))) {
|
|
Path {
|
|
rootPath
|
|
EquipmentInfo.ID.parser()
|
|
}
|
|
Method.delete
|
|
}
|
|
Route(.case(Self.fetch(projectID:))) {
|
|
Path { rootPath }
|
|
Method.get
|
|
Query {
|
|
Field("projectID") { Project.ID.parser() }
|
|
}
|
|
}
|
|
Route(.case(Self.get(id:))) {
|
|
Path {
|
|
rootPath
|
|
EquipmentInfo.ID.parser()
|
|
}
|
|
Method.get
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.Api {
|
|
|
|
public enum ComponentLossRoute: Sendable, Equatable {
|
|
case create(ComponentPressureLoss.Create)
|
|
case delete(id: ComponentPressureLoss.ID)
|
|
case fetch(projectID: Project.ID)
|
|
case get(id: ComponentPressureLoss.ID)
|
|
|
|
static let rootPath = "componentLoss"
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.create)) {
|
|
Path { rootPath }
|
|
Method.post
|
|
Body(.json(ComponentPressureLoss.Create.self))
|
|
}
|
|
Route(.case(Self.delete(id:))) {
|
|
Path {
|
|
rootPath
|
|
ComponentPressureLoss.ID.parser()
|
|
}
|
|
Method.delete
|
|
}
|
|
Route(.case(Self.fetch(projectID:))) {
|
|
Path { rootPath }
|
|
Method.get
|
|
Query {
|
|
Field("projectID") { Project.ID.parser() }
|
|
}
|
|
}
|
|
Route(.case(Self.get(id:))) {
|
|
Path {
|
|
rootPath
|
|
ComponentPressureLoss.ID.parser()
|
|
}
|
|
Method.get
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SiteRoute.Api {
|
|
public enum EffectiveLengthRoute: Equatable, Sendable {
|
|
case create(EffectiveLength.Create)
|
|
case delete(id: EffectiveLength.ID)
|
|
case fetch(projectID: Project.ID)
|
|
case get(id: EffectiveLength.ID)
|
|
|
|
static let rootPath = "effectiveLength"
|
|
|
|
public static let router = OneOf {
|
|
Route(.case(Self.create)) {
|
|
Path {
|
|
rootPath
|
|
"create"
|
|
}
|
|
Method.post
|
|
Body(.json(EffectiveLength.Create.self))
|
|
}
|
|
Route(.case(Self.delete(id:))) {
|
|
Path {
|
|
rootPath
|
|
EffectiveLength.ID.parser()
|
|
}
|
|
Method.delete
|
|
}
|
|
Route(.case(Self.fetch(projectID:))) {
|
|
Path {
|
|
rootPath
|
|
}
|
|
Method.get
|
|
Query {
|
|
Field("projectID") { Project.ID.parser() }
|
|
}
|
|
}
|
|
Route(.case(Self.get(id:))) {
|
|
Path {
|
|
rootPath
|
|
EffectiveLength.ID.parser()
|
|
}
|
|
Method.get
|
|
}
|
|
}
|
|
}
|
|
}
|