account.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package state
  2. import (
  3. "context"
  4. "github.com/google/uuid"
  5. )
  6. // CreateAccountFunc creates a new user account in the database.
  7. //
  8. // Possible errors:
  9. // - ErrAIMHandleInvalidFormat: screen name doesn't start with a letter, ends with a space, or contains invalid
  10. // characters
  11. // - ErrAIMHandleLength: screen name has less than 3 non-space characters or more than 16 characters
  12. // - ErrICQUINInvalidFormat: UIN is not a number or is not in the valid range (10000-2147483646)
  13. // - ErrPasswordInvalid: password length is invalid (AIM: 4-16 chars, ICQ: 6-8 chars)
  14. // - ErrDupUser: a user with the same screen name already exists
  15. // - Other errors from the underlying user store (e.g., database errors)
  16. type CreateAccountFunc func(ctx context.Context, screenName DisplayScreenName, password string) error
  17. // NewAccountCreator returns an account creation function.
  18. func NewAccountCreator(insertUser func(ctx context.Context, u User) error) CreateAccountFunc {
  19. return func(ctx context.Context, screenName DisplayScreenName, password string) error {
  20. if screenName.IsUIN() {
  21. if err := screenName.ValidateUIN(); err != nil {
  22. return err
  23. }
  24. } else {
  25. if err := screenName.ValidateAIMHandle(); err != nil {
  26. return err
  27. }
  28. }
  29. user := User{
  30. AuthKey: uuid.NewString(),
  31. DisplayScreenName: screenName,
  32. IdentScreenName: screenName.IdentScreenName(),
  33. IsICQ: screenName.IsUIN(),
  34. }
  35. if err := user.HashPassword(password); err != nil {
  36. return err
  37. }
  38. if err := insertUser(ctx, user); err != nil {
  39. return err
  40. }
  41. return nil
  42. }
  43. }