aboutsummaryrefslogtreecommitdiff
path: root/pkg/service/auth.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/service/auth.go')
-rw-r--r--pkg/service/auth.go76
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
+}