Skip to content

Commit

Permalink
Merge pull request #61 from yumemi-inc/f-err
Browse files Browse the repository at this point in the history
エラーレスポンス対応
  • Loading branch information
novr authored Jul 5, 2024
2 parents a9f8408 + 54d76e2 commit 5978f86
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Sources/App/Controllers/APIController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ import FakeFortuneTelling

enum APIServiceError: Error {
case InvalidateInput
case unknown
}

struct APIController: APIProtocol {

func post_hyphen_my_hyphen_fortune(_ input: Operations.post_hyphen_my_hyphen_fortune.Input) async throws -> Operations.post_hyphen_my_hyphen_fortune.Output {

let version = input.headers.API_hyphen_Version ?? .v1
switch version {
case .v1:
Expand Down
49 changes: 49 additions & 0 deletions Sources/App/Middlewares/APIQualityMiddleware.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//
// APIQualityMiddleware.swift
//
//
// Created by 古宮 伸久 on 2024/06/20.
//

import Vapor

/// API の品質を表現します。
enum APIQuality: Sendable {
case sometimesFails(probability: Double)
case alwaysFails
case neverFails

func test() -> Bool {
return switch self {
case .sometimesFails(let probability):
shouldFail(probability: probability)
case .alwaysFails:
true
case .neverFails:
false
}
}

private func shouldFail(probability: Double) -> Bool {
return (0 ..< probability).contains(Double.random(in: 0 ..< 1))
}
}

final class APIQualityMiddleware: Middleware, Sendable {

let apiQuality: APIQuality
let onError: Error

init(apiQuality: APIQuality, onError: Error) {
self.apiQuality = apiQuality
self.onError = onError
}

func respond(to request: Vapor.Request, chainingTo next: any Vapor.Responder) -> NIOCore.EventLoopFuture<Vapor.Response> {
if apiQuality.test() {
request.eventLoop.makeFailedFuture(onError)
} else {
next.respond(to: request)
}
}
}
3 changes: 3 additions & 0 deletions Sources/App/configure.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ public func configure(_ app: Application) async throws {
app.middleware.use(
FileMiddleware(publicDirectory: app.directory.publicDirectory, defaultFile: "index.html")
)
app.middleware.use(
APIQualityMiddleware(apiQuality: .sometimesFails(probability: 0.25), onError: APIServiceError.unknown)
)
// register routes
let transport = VaporTransport(routesBuilder: app)
let controller = APIController()
Expand Down

0 comments on commit 5978f86

Please sign in to comment.