Skip to content

Commit cb8ce7d

Browse files
committed
reduce scope of controllers under portal
1 parent 0ddb07f commit cb8ce7d

11 files changed

+174
-150
lines changed

Sources/App/Controllers/Portal/DeleteAccountController.swift

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ import SotoCognitoAuthentication
77
import SotoCognitoIdentityProvider
88
import SotoCognitoIdentity
99

10-
enum DeleteAccountController {
11-
@Sendable
12-
static func deleteAccount(req: Request) async throws -> Response {
13-
@Dependency(\.cognito) var cognito
14-
do {
15-
try await cognito.deleteUser(req: req)
16-
req.auth.logout(AuthenticatedUser.self)
17-
req.session.unauthenticate(AuthenticatedUser.self)
18-
req.session.destroy()
19-
return req.redirect(to: SiteURL.home.relativeURL())
20-
} catch {
21-
return PortalPage.View(path: SiteURL.portal.relativeURL(), model: PortalPage.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document().encodeResponse(status: .internalServerError)
10+
extension Portal {
11+
12+
enum DeleteAccountController {
13+
@Sendable
14+
static func deleteAccount(req: Request) async throws -> Response {
15+
@Dependency(\.cognito) var cognito
16+
do {
17+
try await cognito.deleteUser(req: req)
18+
req.auth.logout(AuthenticatedUser.self)
19+
req.session.unauthenticate(AuthenticatedUser.self)
20+
req.session.destroy()
21+
return req.redirect(to: SiteURL.home.relativeURL())
22+
} catch {
23+
return PortalPage.View(path: SiteURL.portal.relativeURL(), model: PortalPage.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document().encodeResponse(status: .internalServerError)
24+
}
2225
}
2326
}
2427
}

Sources/App/Controllers/Portal/ForgotPasswordController.swift

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,27 @@ import SotoCognitoAuthentication
66
import SotoCognitoIdentityProvider
77
import SotoCognitoIdentity
88

9-
enum ForgotPasswordController {
10-
@Sendable
11-
static func show(req: Request) async throws -> HTML {
12-
return ForgotPassword.View(path: req.url.path, model: ForgotPassword.Model()).document()
13-
}
9+
extension Portal {
1410

15-
@Sendable
16-
static func forgotPasswordEmail(req: Request) async throws -> HTML {
17-
@Dependency(\.cognito) var cognito
18-
struct Credentials: Content {
19-
var email: String
11+
enum ForgotPasswordController {
12+
@Sendable
13+
static func show(req: Request) async throws -> HTML {
14+
return ForgotPassword.View(path: req.url.path, model: ForgotPassword.Model()).document()
2015
}
21-
do {
22-
let user = try req.content.decode(Credentials.self)
23-
try await cognito.forgotPassword(req: req, username: user.email)
24-
return Reset.View(path: SiteURL.resetPassword.relativeURL(), model: Reset.Model(email: user.email)).document()
25-
} catch {
26-
return ForgotPassword.View(path: req.url.path, model: ForgotPassword.Model(errorMessage: "An error occurred: \(error.localizedDescription)")).document()
16+
17+
@Sendable
18+
static func forgotPasswordEmail(req: Request) async throws -> HTML {
19+
@Dependency(\.cognito) var cognito
20+
struct Credentials: Content {
21+
var email: String
22+
}
23+
do {
24+
let user = try req.content.decode(Credentials.self)
25+
try await cognito.forgotPassword(req: req, username: user.email)
26+
return Reset.View(path: SiteURL.resetPassword.relativeURL(), model: Reset.Model(email: user.email)).document()
27+
} catch {
28+
return ForgotPassword.View(path: req.url.path, model: ForgotPassword.Model(errorMessage: "An error occurred: \(error.localizedDescription)")).document()
29+
}
2730
}
2831
}
2932
}

Sources/App/Controllers/Portal/LoginController.swift

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,50 @@ import SotoCognitoAuthentication
77
import SotoCognitoIdentityProvider
88
import SotoCognitoIdentity
99

10-
enum LoginController {
11-
@Sendable
12-
static func show(req: Request) async throws -> HTML {
13-
return Login.View(path: req.url.path, model: Login.Model(errorMessage: "")).document()
14-
}
10+
enum Portal {
1511

16-
@Sendable
17-
static func login(req: Request) async throws -> Response {
18-
@Dependency(\.cognito) var cognito
19-
struct UserCreds: Content {
20-
var email: String
21-
var password: String
12+
enum LoginController {
13+
@Sendable
14+
static func show(req: Request) async throws -> HTML {
15+
return Login.View(path: req.url.path, model: Login.Model(errorMessage: "")).document()
2216
}
23-
do {
24-
let user = try req.content.decode(UserCreds.self)
25-
let response = try await cognito.authenticate(req: req, username: user.email, password: user.password)
26-
switch response {
17+
18+
@Sendable
19+
static func login(req: Request) async throws -> Response {
20+
@Dependency(\.cognito) var cognito
21+
struct UserCreds: Content {
22+
var email: String
23+
var password: String
24+
}
25+
do {
26+
let user = try req.content.decode(UserCreds.self)
27+
let response = try await cognito.authenticate(req: req, username: user.email, password: user.password)
28+
switch response {
2729
case .authenticated(let authenticatedResponse):
2830
let user = AuthenticatedUser(accessToken: authenticatedResponse.accessToken!)
2931
req.auth.login(user)
3032
case .challenged(_): // Cognito is not configured to send challenges, so we should never receive this response.
3133
break
32-
}
33-
return req.redirect(to: SiteURL.portal.relativeURL(), redirectType: .normal)
34-
} catch let error as SotoCognitoError {
35-
var model = Login.Model(errorMessage: "There was an error. Please try again.")
36-
switch error {
34+
}
35+
return req.redirect(to: SiteURL.portal.relativeURL(), redirectType: .normal)
36+
} catch let error as SotoCognitoError {
37+
var model = Login.Model(errorMessage: "There was an error. Please try again.")
38+
switch error {
3739
case .unauthorized(let reason):
3840
model = Login.Model(errorMessage: reason ?? "There was an error. Please try again.")
3941
case .unexpectedResult(let reason):
4042
model = Login.Model(errorMessage: reason ?? "There was an error. Please try again.")
4143
case .invalidPublicKey:
4244
break
45+
}
46+
return Login.View(path: req.url.path, model: model).document().encodeResponse(status: .unauthorized)
47+
} catch let error as AWSClientError {
48+
return Login.View(path: SiteURL.login.relativeURL(), model: Login.Model(errorMessage: "An AWS client error occurred: \(error.errorCode)")).document().encodeResponse(status: .unauthorized)
49+
} catch {
50+
return Login.View(path: SiteURL.login.relativeURL(), model: Login.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document().encodeResponse(status: .unauthorized)
4351
}
44-
return Login.View(path: req.url.path, model: model).document().encodeResponse(status: .unauthorized)
45-
} catch let error as AWSClientError {
46-
return Login.View(path: SiteURL.login.relativeURL(), model: Login.Model(errorMessage: "An AWS client error occurred: \(error.errorCode)")).document().encodeResponse(status: .unauthorized)
47-
} catch {
48-
return Login.View(path: SiteURL.login.relativeURL(), model: Login.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document().encodeResponse(status: .unauthorized)
52+
4953
}
50-
5154
}
5255
}
5356

Sources/App/Controllers/Portal/LogoutController.swift

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ import SotoCognitoAuthentication
66
import SotoCognitoIdentityProvider
77
import SotoCognitoIdentity
88

9-
enum LogoutController {
10-
@Sendable
11-
static func logout(req: Request) async throws -> Response {
12-
req.auth.logout(AuthenticatedUser.self)
13-
req.session.unauthenticate(AuthenticatedUser.self)
14-
req.session.destroy()
15-
return req.redirect(to: SiteURL.home.relativeURL())
9+
extension Portal {
10+
11+
enum LogoutController {
12+
@Sendable
13+
static func logout(req: Request) async throws -> Response {
14+
req.auth.logout(AuthenticatedUser.self)
15+
req.session.unauthenticate(AuthenticatedUser.self)
16+
req.session.destroy()
17+
return req.redirect(to: SiteURL.home.relativeURL())
18+
}
1619
}
1720
}
1821

Sources/App/Controllers/Portal/PortalController.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ import Plot
33
import Vapor
44
import SotoCognitoAuthenticationKit
55

6-
enum PortalController {
7-
@Sendable
8-
static func show(req: Request) async throws -> HTML {
9-
return PortalPage.View(path: req.url.path, model: PortalPage.Model()).document()
6+
extension Portal {
7+
8+
enum PortalController {
9+
@Sendable
10+
static func show(req: Request) async throws -> HTML {
11+
return PortalPage.View(path: req.url.path, model: PortalPage.Model()).document()
12+
}
1013
}
1114
}

Sources/App/Controllers/Portal/ResetController.swift

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,35 @@ import SotoCognitoAuthentication
66
import SotoCognitoIdentityProvider
77
import SotoCognitoIdentity
88

9-
enum ResetController {
10-
@Sendable
11-
static func show(req: Request) async throws -> HTML {
12-
return Reset.View(path: req.url.path, model: Reset.Model()).document()
13-
}
9+
extension Portal {
1410

15-
@Sendable
16-
static func resetPassword(req: Request) async throws -> HTML {
17-
@Dependency(\.cognito) var cognito
18-
struct UserInfo: Content {
19-
var email: String
20-
var password: String
21-
var confirmationCode: String
11+
enum ResetController {
12+
@Sendable
13+
static func show(req: Request) async throws -> HTML {
14+
return Reset.View(path: req.url.path, model: Reset.Model()).document()
2215
}
23-
do {
24-
let user = try req.content.decode(UserInfo.self)
25-
try await cognito.resetPassword(req: req, username: user.email, password: user.password, confirmationCode: user.confirmationCode)
26-
let model = SuccessfulChange.Model(successMessage: "Successfully changed password")
27-
return SuccessfulChange.View(path: req.url.path, model: model).document()
28-
} catch let error as AWSErrorType {
29-
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
30-
let model = Reset.Model(errorMessage: errorMessage)
31-
return Reset.View(path: req.url.path, model: model).document()
32-
} catch {
33-
let model = Reset.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")
34-
return Reset.View(path: req.url.path, model: model).document()
16+
17+
@Sendable
18+
static func resetPassword(req: Request) async throws -> HTML {
19+
@Dependency(\.cognito) var cognito
20+
struct UserInfo: Content {
21+
var email: String
22+
var password: String
23+
var confirmationCode: String
24+
}
25+
do {
26+
let user = try req.content.decode(UserInfo.self)
27+
try await cognito.resetPassword(req: req, username: user.email, password: user.password, confirmationCode: user.confirmationCode)
28+
let model = SuccessfulChange.Model(successMessage: "Successfully changed password")
29+
return SuccessfulChange.View(path: req.url.path, model: model).document()
30+
} catch let error as AWSErrorType {
31+
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
32+
let model = Reset.Model(errorMessage: errorMessage)
33+
return Reset.View(path: req.url.path, model: model).document()
34+
} catch {
35+
let model = Reset.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")
36+
return Reset.View(path: req.url.path, model: model).document()
37+
}
3538
}
3639
}
3740
}

Sources/App/Controllers/Portal/SignupController.swift

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,33 @@ import SotoCognitoAuthentication
66
import SotoCognitoIdentityProvider
77
import SotoCognitoIdentity
88

9-
enum SignupController {
10-
@Sendable
11-
static func show(req: Request) async throws -> HTML {
12-
return Signup.View(path: req.url.path, model: Signup.Model(errorMessage: "")).document()
13-
}
9+
extension Portal {
1410

15-
@Sendable
16-
static func signup(req: Request) async throws -> HTML {
17-
@Dependency(\.cognito) var cognito
18-
struct UserCreds: Content {
19-
var email: String
20-
var password: String
21-
}
22-
do {
23-
let user = try req.content.decode(UserCreds.self)
24-
try await cognito.signup(req: req, username: user.email, password: user.password)
25-
return Verify.View(path: SiteURL.verify.relativeURL(), model: Verify.Model(email: user.email)).document()
26-
} catch let error as AWSErrorType {
27-
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
28-
let model = Signup.Model(errorMessage: errorMessage)
29-
return Signup.View(path: req.url.path, model: model).document()
30-
} catch {
31-
return Signup.View(path: SiteURL.signup.relativeURL(), model: Signup.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document()
11+
enum SignupController {
12+
@Sendable
13+
static func show(req: Request) async throws -> HTML {
14+
return Signup.View(path: req.url.path, model: Signup.Model(errorMessage: "")).document()
3215
}
3316

17+
@Sendable
18+
static func signup(req: Request) async throws -> HTML {
19+
@Dependency(\.cognito) var cognito
20+
struct UserCreds: Content {
21+
var email: String
22+
var password: String
23+
}
24+
do {
25+
let user = try req.content.decode(UserCreds.self)
26+
try await cognito.signup(req: req, username: user.email, password: user.password)
27+
return Verify.View(path: SiteURL.verify.relativeURL(), model: Verify.Model(email: user.email)).document()
28+
} catch let error as AWSErrorType {
29+
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
30+
let model = Signup.Model(errorMessage: errorMessage)
31+
return Signup.View(path: req.url.path, model: model).document()
32+
} catch {
33+
return Signup.View(path: SiteURL.signup.relativeURL(), model: Signup.Model(errorMessage: "An unknown error occurred: \(error.localizedDescription)")).document()
34+
}
35+
36+
}
3437
}
3538
}
36-

Sources/App/Controllers/Portal/VerifyController.swift

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,36 @@ import SotoCognitoIdentityProvider
77
import SotoCognitoIdentity
88
import Dependencies
99

10-
enum VerifyController {
11-
@Sendable
12-
static func show(req: Request) async throws -> HTML {
13-
return Verify.View(path: req.url.path, model: Verify.Model(email: "")).document()
14-
}
10+
extension Portal {
1511

16-
@Sendable
17-
static func verify(req: Request) async throws -> HTML {
18-
@Dependency(\.cognito) var cognito
19-
struct VerifyInformation: Content {
20-
var email: String
21-
var confirmationCode: String
12+
enum VerifyController {
13+
@Sendable
14+
static func show(req: Request) async throws -> HTML {
15+
return Verify.View(path: req.url.path, model: Verify.Model(email: "")).document()
2216
}
23-
do {
24-
let info = try req.content.decode(VerifyInformation.self)
25-
try await cognito.confirmSignUp(req: req, username: info.email, confirmationCode: info.confirmationCode)
26-
let model = SuccessfulChange.Model(successMessage: "Successfully confirmed signup")
27-
return SuccessfulChange.View(path: req.url.path, model: model).document()
28-
} catch let error as AWSErrorType {
29-
let info = try req.content.decode(VerifyInformation.self)
30-
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
31-
let model = Verify.Model(email: info.email, errorMessage: errorMessage)
32-
return Verify.View(path: req.url.path, model: model).document()
33-
} catch {
34-
let info = try req.content.decode(VerifyInformation.self)
35-
let model = Verify.Model(email: info.email, errorMessage: "An unknown error occurred: \(error.localizedDescription)")
36-
return Verify.View(path: req.url.path, model: model).document()
17+
18+
@Sendable
19+
static func verify(req: Request) async throws -> HTML {
20+
@Dependency(\.cognito) var cognito
21+
struct VerifyInformation: Content {
22+
var email: String
23+
var confirmationCode: String
24+
}
25+
do {
26+
let info = try req.content.decode(VerifyInformation.self)
27+
try await cognito.confirmSignUp(req: req, username: info.email, confirmationCode: info.confirmationCode)
28+
let model = SuccessfulChange.Model(successMessage: "Successfully confirmed signup")
29+
return SuccessfulChange.View(path: req.url.path, model: model).document()
30+
} catch let error as AWSErrorType {
31+
let info = try req.content.decode(VerifyInformation.self)
32+
let errorMessage = (error.message != nil) ? "There was an error: \(error.message)" : "There was an error: \(error.localizedDescription)"
33+
let model = Verify.Model(email: info.email, errorMessage: errorMessage)
34+
return Verify.View(path: req.url.path, model: model).document()
35+
} catch {
36+
let info = try req.content.decode(VerifyInformation.self)
37+
let model = Verify.Model(email: info.email, errorMessage: "An unknown error occurred: \(error.localizedDescription)")
38+
return Verify.View(path: req.url.path, model: model).document()
39+
}
3740
}
3841
}
3942
}

Sources/App/Controllers/Portal/Cognito.swift renamed to Sources/App/Core/Cognito.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import SotoCognitoAuthentication
33
import SotoCognitoIdentityProvider
44
import SotoCognitoIdentity
55

6+
67
struct Cognito {
78
@Sendable
89
static func authenticate(req: Request, username: String, password: String) async throws -> CognitoAuthenticateResponse {
File renamed without changes.

0 commit comments

Comments
 (0)