Skip to content
This repository was archived by the owner on Apr 20, 2024. It is now read-only.

Commit 9a07407

Browse files
committed
added source and gitignore
1 parent 3d2ba6b commit 9a07407

File tree

1,268 files changed

+319339
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,268 files changed

+319339
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,4 @@ fastlane/report.xml
6666
fastlane/Preview.html
6767
fastlane/screenshots
6868
fastlane/test_output
69+
.DS_Store
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import Vapor
2+
import HTTP
3+
4+
public final class BackendUserRolesController {
5+
6+
public let drop: Droplet
7+
8+
public init(droplet: Droplet) {
9+
drop = droplet
10+
}
11+
12+
/**
13+
* List all backend users
14+
*
15+
* - param: Request
16+
* - return: View
17+
*/
18+
public func index(request: Request) throws -> ResponseRepresentable {
19+
let roles = try BackendUserRole.all()
20+
let rolesNodes = try roles.map({ try $0.makeNode() })
21+
22+
return try drop.view.make("BackendUsers/roles", [
23+
"roles": Node(rolesNodes)
24+
], for: request)
25+
}
26+
27+
public func store(request: Request) throws -> ResponseRepresentable {
28+
do {
29+
var role = try BackendUserRole(request: request)
30+
try role.save()
31+
return Response(redirect: "/admin/backend_users/roles").flash(.success, "Role created");
32+
}catch let error as ValidationErrorProtocol {
33+
let message = "Validation error: \(error.message)"
34+
return Response(redirect: "/admin/backend_users/roles").flash(.error, message);
35+
}catch {
36+
return Response(redirect: "/admin/backend_users/roles").flash(.error, "Failed to save role");
37+
}
38+
}
39+
40+
public func setDeault(request: Request, role: BackendUserRole) throws -> ResponseRepresentable {
41+
do {
42+
// Set all roles to not default
43+
for entry in try BackendUserRole.all() {
44+
var editableRole = entry
45+
editableRole.isDefault = false;
46+
try editableRole.save()
47+
}
48+
49+
// Set selected role default
50+
var editableRole = role
51+
editableRole.isDefault = true
52+
try editableRole.save()
53+
54+
return Response(redirect: "/admin/backend_users/roles").flash(.success, "Role is default");
55+
} catch {
56+
return Response(redirect: "/admin/backend_users/roles").flash(.error, "Failed to update role");
57+
}
58+
}
59+
60+
public func delete(request: Request, role: BackendUserRole) throws -> ResponseRepresentable {
61+
do {
62+
63+
try role.delete()
64+
65+
return Response(redirect: "/admin/backend_users/roles").flash(.success, "Role is deleted");
66+
} catch {
67+
return Response(redirect: "/admin/backend_users/roles").flash(.error, "Failed to delete role");
68+
}
69+
}
70+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import Vapor
2+
import HTTP
3+
4+
public final class BackendUsersController {
5+
6+
public let drop: Droplet
7+
8+
public init(droplet: Droplet) {
9+
drop = droplet
10+
}
11+
12+
public func logout(request: Request) throws -> ResponseRepresentable {
13+
try request.auth.logout()
14+
return Response(redirect: "/admin").flash(.error, "User is logged out");
15+
}
16+
17+
/**
18+
* List all backend users
19+
*
20+
* - param: Request
21+
* - return: View
22+
*/
23+
public func index(request: Request) throws -> ResponseRepresentable {
24+
let users = try BackendUser.all().makeNode() // todo pagination && search
25+
26+
return try drop.view.make("BackendUsers/index", [
27+
"users": users
28+
], for: request)
29+
}
30+
31+
/**
32+
* Create user form
33+
*
34+
* - param: Request
35+
* - return: View
36+
*/
37+
public func create(request: Request) throws -> ResponseRepresentable {
38+
return try drop.view.make("BackendUsers/edit", [
39+
"roles": BackendUserRole.all().makeNode()
40+
], for: request)
41+
}
42+
43+
/**
44+
* Save new user
45+
*
46+
* - param: Request
47+
* - return: View
48+
*/
49+
public func store(request: Request) throws -> ResponseRepresentable {
50+
do {
51+
var backendUser = try BackendUser(request: request)
52+
try backendUser.save()
53+
54+
// TODO Send welcome mail
55+
56+
return Response(redirect: "/admin/backend_users").flash(.success, "User created")
57+
} catch let error as ValidationErrorProtocol {
58+
let message = "Validation error: \(error.message)"
59+
return Response(redirect: "/admin/backend_users/create").flash(.error, message)
60+
} catch {
61+
return Response(redirect: "/admin/backend_users/create").flash(.error, "Failed to create user")
62+
}
63+
}
64+
65+
/**
66+
* Edit user form
67+
*
68+
* - param: Request
69+
* - param: BackendUser
70+
* - return: View
71+
*/
72+
public func edit(request: Request, user: BackendUser) throws -> ResponseRepresentable {
73+
return try drop.view.make("BackendUsers/edit", [
74+
"backendUser": try user.makeNode(),
75+
"roles": BackendUserRole.all().makeNode()
76+
], for: request)
77+
}
78+
79+
/**
80+
* Update user
81+
*
82+
* - param: Request
83+
* - param: BackendUser
84+
* - return: View
85+
*/
86+
public func update(request: Request, user: BackendUser) throws -> ResponseRepresentable {
87+
var backendUser = user;
88+
89+
// User details
90+
//backendUser.name = request.data["name"]?.string
91+
backendUser.email = try request.data["email"].validated()
92+
//backendUser.role = request.data["role"]?.string
93+
94+
// Change password
95+
if let password = request.data["password"]?.string, let passwordRepeat = request.data["passwordRepeat"]?.string, password == passwordRepeat {
96+
backendUser.password = try drop.hash.make(password)
97+
}
98+
99+
// Save
100+
try backendUser.save()
101+
102+
return Response(redirect: "/admin/backend_users")
103+
}
104+
105+
/**
106+
* Delete user
107+
*
108+
* - param: Request
109+
* - param: BackendUser
110+
* - return: View
111+
*/
112+
public func destroy(request: Request, user: BackendUser) throws -> ResponseRepresentable {
113+
do {
114+
try user.delete()
115+
return Response(redirect: "/admin/backend_users").flash(.success, "Deleted user")
116+
} catch {
117+
return Response(redirect: "/admin/backend_users").flash(.error, "Failed to delete user")
118+
}
119+
}
120+
121+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Vapor
2+
import HTTP
3+
import Auth
4+
5+
public final class DashboardController {
6+
7+
public let drop: Droplet
8+
9+
public init(droplet: Droplet) {
10+
drop = droplet
11+
}
12+
13+
public func index(request: Request) throws -> ResponseRepresentable {
14+
return try drop.view.make("Dashboard/view", for: request)
15+
}
16+
17+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import Foundation
2+
import Vapor
3+
import Auth
4+
import HTTP
5+
import Turnstile
6+
import TurnstileCrypto
7+
import TurnstileWeb
8+
9+
public final class LoginController {
10+
11+
public let drop: Droplet
12+
13+
public init(droplet: Droplet) {
14+
drop = droplet
15+
}
16+
17+
public func landing(request: Request) throws -> ResponseRepresentable {
18+
do {
19+
guard let user: BackendUser = try request.auth.user() as? BackendUser else {
20+
throw Abort.custom(status: .forbidden, message: "Forbidden")
21+
}
22+
23+
return Response(redirect: "/admin/dashboard").flash(.success, "Logged in as \(user.email.value)")
24+
} catch {
25+
return Response(redirect: "/admin/login").flash(.error, "Please login")
26+
}
27+
}
28+
29+
public func resetPasswordForm(request: Request) throws -> ResponseRepresentable {
30+
return try drop.view.make("Login/reset", for: request)
31+
}
32+
33+
public func resetPasswordSubmit(request: Request) throws -> ResponseRepresentable {
34+
guard let email = request.data["email"]?.string else {
35+
throw Abort.custom(status: Status.badRequest, message: "Missing email")
36+
}
37+
38+
guard let user: BackendUser = try BackendUser.query().filter("email", email).first() else {
39+
throw Abort.custom(status: Status.badRequest, message: "Email doesn ot exist")
40+
}
41+
42+
// Consider expiring old tokes for this user
43+
44+
// Make a token
45+
var token = try BackendUserResetPasswordTokens(email: user.email.value)
46+
try token.save()
47+
48+
return Response(redirect: "/admin/login").flash(.success, "Message sent");
49+
}
50+
51+
public func form(request: Request) throws -> ResponseRepresentable {
52+
return try drop.view.make("Login/login", for: request)
53+
}
54+
55+
public func submit(request: Request) throws -> ResponseRepresentable {
56+
// Get our credentials
57+
guard let username = request.data["email"]?.string, let password = request.data["password"]?.string else {
58+
throw Abort.custom(status: Status.badRequest, message: "Missing username or password")
59+
}
60+
let credentials = UsernamePassword(username: username, password: password)
61+
62+
do {
63+
try request.auth.login(credentials)
64+
65+
// Todo deal with remember me
66+
67+
return Response(redirect: "/admin/dashboard").flash(.success, "Logged in as \(credentials.username)")
68+
} catch {
69+
return Response(redirect: "/admin/login").flash(.error, "Failed to login");
70+
}
71+
72+
}
73+
}

0 commit comments

Comments
 (0)