package auth import ( "context" "golang.org/x/crypto/bcrypt" "git.sr.ht/~gabrielgio/img/pkg/components" "git.sr.ht/~gabrielgio/img/pkg/database/repository" "git.sr.ht/~gabrielgio/img/pkg/ext" ) type Controller struct { authRepository repository.AuthRepository userRepository repository.UserRepository key []byte } func NewController( authRepository repository.AuthRepository, userRepository repository.UserRepository, key []byte, ) *Controller { return &Controller{ authRepository: authRepository, userRepository: userRepository, key: key, } } func (c *Controller) 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 *Controller) InitialRegister(ctx context.Context, username, password []byte, path []byte) error { exist, err := c.userRepository.Any(ctx) if err != nil { return err } if exist { return components.InvlidaInput } 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 }