diff options
Diffstat (limited to 'server/admin')
-rw-r--r-- | server/admin/handler.go | 41 | ||||
-rw-r--r-- | server/admin/models.go | 15 | ||||
-rw-r--r-- | server/admin/store.go | 15 |
3 files changed, 33 insertions, 38 deletions
diff --git a/server/admin/handler.go b/server/admin/handler.go index b8f1d7f..2ae0b0d 100644 --- a/server/admin/handler.go +++ b/server/admin/handler.go @@ -12,15 +12,15 @@ import ( ) type AdminHandler struct { - adminStore adminStore + adminStore AdminStore guestStore guest.GuestStore } -type adminStore interface { - Find(admin Admin) (Admin, error) +type AdminStore interface { + Find(Admin) (Admin, error) } -func NewAdminHandler(a adminStore, g guest.GuestStore) *AdminHandler { +func NewAdminHandler(a AdminStore, g guest.GuestStore) *AdminHandler { return &AdminHandler{a, g} } @@ -45,21 +45,19 @@ func (a *AdminHandler) handleLogIn(w http.ResponseWriter, r *http.Request) { } func (a *AdminHandler) logIn(r *http.Request) ([]byte, *errors.AppError) { - requestAdmin, err := a.decodeCredentials(r) + admin, err := a.decodeCredentials(r) if err != nil { return nil, errors.NewAppError(http.StatusBadRequest, err.Error()) } - _, err = a.adminStore.Find(requestAdmin) + _, err = a.adminStore.Find(admin) if err != nil { return nil, errors.NewAppError(http.StatusUnauthorized, err.Error()) } - expirationTime := a.setExpirationTime() - claims := a.createClaims(requestAdmin, expirationTime) key, err := a.readKey() if err != nil { return nil, errors.NewAppError(http.StatusInternalServerError, err.Error()) } - token, err := a.createToken(claims, key) + token, err := a.newToken(NewClaims(admin, a.setExpirationTime()), key) if err != nil { return nil, errors.NewAppError(http.StatusInternalServerError, err.Error()) } @@ -85,31 +83,14 @@ func (a *AdminHandler) setExpirationTime() time.Time { return time.Now().Add(15 * time.Minute) } -func (a *AdminHandler) createClaims(admin Admin, expirationTime time.Time) *Claims { - return &Claims{ - admin, - jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(expirationTime), - }, - } -} - func (a *AdminHandler) readKey() ([]byte, error) { return os.ReadFile(os.Getenv("ADMIN_KEY")) } -func (a *AdminHandler) createToken(claims *Claims, key []byte) (string, error) { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return token.SignedString(key) -} - -func (a *AdminHandler) marshalResponse(guests []guest.Guest, - token string) ([]byte, error) { - loginResponse := a.createLoginResponse(guests, token) - return json.Marshal(loginResponse) +func (a *AdminHandler) newToken(claims *Claims, key []byte) (string, error) { + return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(key) } -func (a *AdminHandler) createLoginResponse(guests []guest.Guest, - token string) *Login { - return &Login{guests, token} +func (a *AdminHandler) marshalResponse(guests []guest.Guest, token string) ([]byte, error) { + return json.Marshal(NewLogin(guests, token)) } diff --git a/server/admin/models.go b/server/admin/models.go index 275f617..524099b 100644 --- a/server/admin/models.go +++ b/server/admin/models.go @@ -1,6 +1,8 @@ package admin import ( + "time" + "git.huntm.net/wedding/server/guest" "github.com/golang-jwt/jwt/v5" ) @@ -20,3 +22,16 @@ type Login struct { Guests []guest.Guest `json:"guests"` Token string `json:"token"` } + +func NewClaims(admin Admin, expirationTime time.Time) *Claims { + return &Claims{ + admin, + jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expirationTime), + }, + } +} + +func NewLogin(guests []guest.Guest, token string) *Login { + return &Login{guests, token} +} diff --git a/server/admin/store.go b/server/admin/store.go index 3322b35..9a7f639 100644 --- a/server/admin/store.go +++ b/server/admin/store.go @@ -19,14 +19,13 @@ func NewStore(database *pgxpool.Pool) *Store { } } -func (store Store) Find(requestAdmin Admin) (Admin, error) { - adminRows, err := store.database.Query(context.Background(), - "select * from admin") +func (s *Store) Find(requestAdmin Admin) (Admin, error) { + adminRows, err := s.database.Query(context.Background(), "select * from admin") if err != nil { return Admin{}, err } defer adminRows.Close() - admin, found := createAdmin(requestAdmin, adminRows) + admin, found := s.newAdmin(requestAdmin, adminRows) if found { return admin, nil @@ -34,7 +33,7 @@ func (store Store) Find(requestAdmin Admin) (Admin, error) { return Admin{}, errors.New("invalid username or password") } -func createAdmin(requestAdmin Admin, adminRows pgx.Rows) (Admin, bool) { +func (s *Store) newAdmin(requestAdmin Admin, adminRows pgx.Rows) (Admin, bool) { var databaseAdmin Admin for adminRows.Next() { err := adminRows.Scan(&databaseAdmin.Id, &databaseAdmin.Username, &databaseAdmin.Password) @@ -42,13 +41,13 @@ func createAdmin(requestAdmin Admin, adminRows pgx.Rows) (Admin, bool) { return Admin{}, false } if databaseAdmin.Username == requestAdmin.Username && - verifyPassword(databaseAdmin.Password, requestAdmin.Password) { + s.verifyPassword(databaseAdmin.Password, requestAdmin.Password) { return databaseAdmin, true } } return Admin{}, false } -func verifyPassword(hashedPassword string, password string) bool { - return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) == nil +func (s *Store) verifyPassword(hash string, password string) bool { + return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil } |