Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

43 строки
1.0 KiB

  1. //
  2. // File.swift
  3. //
  4. //
  5. // Created by Michiel Carman on 9/26/24.
  6. //
  7. import Vapor
  8. import Fluent
  9. struct UserSignup: Content {
  10. let username: String
  11. let password: String
  12. }
  13. struct NewSession: Content {
  14. let token: String
  15. let user: User.Public
  16. }
  17. extension UserSignup: Validatable {
  18. static func validations(_ validations: inout Validations) {
  19. validations.add("username", as: String.self, is: !.empty)
  20. validations.add("password", as: String.self, is: .count(6...))
  21. }
  22. }
  23. struct UserController: RouteCollection {
  24. func boot(routes: any RoutesBuilder) throws {
  25. let users = routes.grouped("users")
  26. users.post(use: create)
  27. }
  28. @Sendable
  29. func create(req: Request) async throws -> Response{
  30. let user = try req.content.decode(User.self)
  31. user.passwordHash = try Bcrypt.hash(user.passwordHash)
  32. try await user.save(on: req.db)
  33. let token = try Token.generate(for: user)
  34. try await token.save(on: req.db)
  35. return try await token.encodeResponse(for: req)
  36. }
  37. }