diff options
Diffstat (limited to 'pkg/service/auth.go')
-rw-r--r-- | pkg/service/auth.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/pkg/service/auth.go b/pkg/service/auth.go new file mode 100644 index 0000000..4358a8a --- /dev/null +++ b/pkg/service/auth.go @@ -0,0 +1,76 @@ +package service + +import ( + "context" + + "golang.org/x/crypto/bcrypt" + + "git.sr.ht/~gabrielgio/img/pkg/database/repository" + "git.sr.ht/~gabrielgio/img/pkg/ext" +) + +type AuthController struct { + authRepository repository.AuthRepository + userRepository repository.UserRepository + key []byte +} + +func NewAuthController( + authRepository repository.AuthRepository, + userRepository repository.UserRepository, + key []byte, +) *AuthController { + return &AuthController{ + authRepository: authRepository, + userRepository: userRepository, + key: key, + } +} + +func (c *AuthController) Login(ctx context.Context, username, password []byte) ([]byte, error) { + id, err := c.authRepository.GetIDByUsername(ctx, string(username)) + if err != nil { + return nil, err + } + + hashedPassword, err := c.authRepository.GetPassword(ctx, id) + if err != nil { + return nil, err + } + + if err := bcrypt.CompareHashAndPassword(hashedPassword, password); err != nil { + return nil, err + } + + token := &ext.Token{ + UserID: id, + Username: string(username), + } + return ext.WriteToken(token, c.key) +} + +// InitialRegister register a initial user, it will validate if there is another +// user stored already. If so an error `InvlidaInput` will be returned +func (c *AuthController) InitialRegister(ctx context.Context, username, password []byte, path []byte) error { + exist, err := c.userRepository.Any(ctx) + if err != nil { + return err + } + + if exist { + return InvlidInput + } + + hash, err := bcrypt.GenerateFromPassword(password, bcrypt.MinCost) + if err != nil { + return err + } + + _, err = c.userRepository.Create(ctx, &repository.CreateUser{ + Username: string(username), + Password: hash, + Path: string(path), + }) + + return err +} |