diff options
Diffstat (limited to 'server/guest')
-rw-r--r-- | server/guest/handler.go | 55 | ||||
-rw-r--r-- | server/guest/models.go | 22 | ||||
-rw-r--r-- | server/guest/store.go | 73 |
3 files changed, 69 insertions, 81 deletions
diff --git a/server/guest/handler.go b/server/guest/handler.go index f596b05..86ffa84 100644 --- a/server/guest/handler.go +++ b/server/guest/handler.go @@ -21,11 +21,11 @@ type GuestHandler struct { } type GuestStore interface { - Find(name Name) (Guest, error) + Find(Name) (Guest, error) Get() ([]Guest, error) - Add(guest Guest) error - Update(guest Guest) error - Delete(id string) error + Add(Guest) error + Update(Guest) error + Delete(string) error } func NewGuestHandler(s GuestStore) *GuestHandler { @@ -87,9 +87,8 @@ func (g *GuestHandler) handlePost(w http.ResponseWriter, r *http.Request) { } } -func (g *GuestHandler) handleDelete(w http.ResponseWriter, - request *http.Request) { - if err := g.deleteGuest(request); err != nil { +func (g *GuestHandler) handleDelete(w http.ResponseWriter, r *http.Request) { + if err := g.deleteGuest(r); err != nil { http.Error(w, string(err.Message), err.Status) } else { w.WriteHeader(http.StatusOK) @@ -105,13 +104,11 @@ func (g *GuestHandler) logIn(r *http.Request) ([]byte, *errors.AppError) { if err != nil { return nil, errors.NewAppError(http.StatusUnauthorized, err.Error()) } - expirationTime := g.setExpirationTime() - claims := g.createClaims(name, expirationTime) key, err := g.readGuestKey() if err != nil { return nil, errors.NewAppError(http.StatusInternalServerError, err.Error()) } - token, err := g.createToken(claims, key) + token, err := g.newToken(NewClaims(name, g.setExpirationTime()), key) if err != nil { return nil, errors.NewAppError(http.StatusInternalServerError, err.Error()) } @@ -133,15 +130,6 @@ func (g *GuestHandler) setExpirationTime() time.Time { return time.Now().Add(15 * time.Minute) } -func (g *GuestHandler) createClaims(name Name, time time.Time) *Claims { - return &Claims{ - Name: name, - RegisteredClaims: jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(time), - }, - } -} - func (g *GuestHandler) readGuestKey() ([]byte, error) { return os.ReadFile(os.Getenv("GUEST_KEY")) } @@ -150,21 +138,12 @@ func (g *GuestHandler) readAdminKey() ([]byte, error) { return os.ReadFile(os.Getenv("ADMIN_KEY")) } -func (g *GuestHandler) createToken(claims *Claims, key []byte) (string, error) { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return token.SignedString(key) +func (g *GuestHandler) newToken(claims *Claims, key []byte) (string, error) { + return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(key) } func (g *GuestHandler) marshalResponse(guest Guest, token string) ([]byte, error) { - loginResponse := g.createLoginResponse(guest, token) - return json.Marshal(loginResponse) -} - -func (g *GuestHandler) createLoginResponse(guest Guest, token string) *Login { - return &Login{ - Guest: guest, - Token: token, - } + return json.Marshal(NewLogin(guest, token)) } func (g *GuestHandler) putGuest(r *http.Request) *errors.AppError { @@ -189,9 +168,7 @@ func (g *GuestHandler) putGuest(r *http.Request) *errors.AppError { } func (g *GuestHandler) validateToken(r *http.Request, key []byte) *errors.AppError { - authorizationHeader := g.getToken(r) - claims := g.newClaims() - token, err := g.parseWithClaims(authorizationHeader, claims, key) + token, err := g.parseWithClaims(g.getToken(r), g.newClaims(), key) if err != nil { if err == jwt.ErrSignatureInvalid { return errors.NewAppError(http.StatusUnauthorized, err.Error()) @@ -212,16 +189,14 @@ func (g *GuestHandler) newClaims() *Claims { return &Claims{} } -func (g *GuestHandler) parseWithClaims(token string, claims *Claims, - key []byte) (*jwt.Token, error) { +func (g *GuestHandler) parseWithClaims(token string, claims *Claims, key []byte) (*jwt.Token, error) { return jwt.ParseWithClaims(token, claims, func(token *jwt.Token) (any, error) { return key, nil }) } func (g *GuestHandler) findId(r *http.Request) bool { - matches := guestIdRegex.FindStringSubmatch(r.URL.Path) - return len(matches) < 2 + return len(guestIdRegex.FindStringSubmatch(r.URL.Path)) < 2 } func (g *GuestHandler) decodeGuest(r *http.Request) (Guest, error) { @@ -295,9 +270,7 @@ func (g *GuestHandler) deleteGuest(r *http.Request) *errors.AppError { if g.findId(r) { return errors.NewAppError(http.StatusNotFound, "cannot delete guest that does not exist") } - guestId := getId(r) - err = g.store.Delete(guestId) - if err != nil { + if err := g.store.Delete(getId(r)); err != nil { return errors.NewAppError(http.StatusInternalServerError, err.Error()) } return nil diff --git a/server/guest/models.go b/server/guest/models.go index 280ee97..e484569 100644 --- a/server/guest/models.go +++ b/server/guest/models.go @@ -1,6 +1,10 @@ package guest -import "github.com/golang-jwt/jwt/v5" +import ( + "time" + + "github.com/golang-jwt/jwt/v5" +) type Guest struct { Id string `json:"id"` @@ -27,3 +31,19 @@ type Login struct { Guest Guest `json:"guest"` Token string `json:"token"` } + +func NewClaims(name Name, time time.Time) *Claims { + return &Claims{ + Name: name, + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(time), + }, + } +} + +func NewLogin(guest Guest, token string) *Login { + return &Login{ + Guest: guest, + Token: token, + } +} diff --git a/server/guest/store.go b/server/guest/store.go index 56a8c2c..e111ea0 100644 --- a/server/guest/store.go +++ b/server/guest/store.go @@ -18,23 +18,21 @@ func NewStore(database *pgxpool.Pool) *Store { } } -func (store Store) Find(name Name) (Guest, error) { - guestRows, err := store.database.Query(context.Background(), - "select * from guest") +func (s *Store) Find(name Name) (Guest, error) { + guestRows, err := s.database.Query(context.Background(), "select * from guest") if err != nil { return Guest{}, err } defer guestRows.Close() - guest, found := createGuest(name, guestRows) + guest, found := s.createGuest(name, guestRows) - partyRows, err := store.database.Query(context.Background(), - "select * from party") + partyRows, err := s.database.Query(context.Background(), "select * from party") if err != nil { return Guest{}, err } defer partyRows.Close() - guest, err = addParty(guest, partyRows) + guest, err = s.addParty(guest, partyRows) if err != nil { return Guest{}, err } @@ -45,7 +43,7 @@ func (store Store) Find(name Name) (Guest, error) { return Guest{}, errors.New("guest not found") } -func createGuest(name Name, guestRows pgx.Rows) (Guest, bool) { +func (s *Store) createGuest(name Name, guestRows pgx.Rows) (Guest, bool) { var guest Guest for guestRows.Next() { err := guestRows.Scan(&guest.Id, &guest.FirstName, &guest.LastName, @@ -61,7 +59,7 @@ func createGuest(name Name, guestRows pgx.Rows) (Guest, bool) { return Guest{}, false } -func addParty(guestWithoutParty Guest, partyRows pgx.Rows) (Guest, error) { +func (s *Store) addParty(guestWithoutParty Guest, partyRows pgx.Rows) (Guest, error) { guestWithParty := guestWithoutParty for partyRows.Next() { var guestId string @@ -77,34 +75,32 @@ func addParty(guestWithoutParty Guest, partyRows pgx.Rows) (Guest, error) { return guestWithParty, nil } -func (store Store) Get() ([]Guest, error) { - guestRows, err := store.database.Query(context.Background(), - "select * from guest") +func (s *Store) Get() ([]Guest, error) { + guestRows, err := s.database.Query(context.Background(), "select * from guest") if err != nil { return nil, err } defer guestRows.Close() - guestsWithoutParty, err := store.createGuestSlice(guestRows) + guestsWithoutParty, err := s.createGuestSlice(guestRows) if err != nil { return []Guest{}, err } - partyRows, err := store.database.Query(context.Background(), - "select * from party") + partyRows, err := s.database.Query(context.Background(), "select * from party") if err != nil { return []Guest{}, err } defer partyRows.Close() - guestsWithParty, err := addPartySlice(guestsWithoutParty, partyRows) + guestsWithParty, err := s.addPartySlice(guestsWithoutParty, partyRows) if err != nil { return []Guest{}, err } return guestsWithParty, nil } -func (store Store) createGuestSlice(guestRows pgx.Rows) ([]Guest, error) { +func (s *Store) createGuestSlice(guestRows pgx.Rows) ([]Guest, error) { guests := []Guest{} for guestRows.Next() { var guest Guest @@ -118,8 +114,7 @@ func (store Store) createGuestSlice(guestRows pgx.Rows) ([]Guest, error) { return guests, nil } -func addPartySlice(guestsWithoutParty []Guest, - partyRows pgx.Rows) ([]Guest, error) { +func (s *Store) addPartySlice(guestsWithoutParty []Guest, partyRows pgx.Rows) ([]Guest, error) { guestsWithParty := guestsWithoutParty for partyRows.Next() { var guestId string @@ -137,51 +132,51 @@ func addPartySlice(guestsWithoutParty []Guest, return guestsWithParty, nil } -func (store Store) Add(guest Guest) error { - if err := store.insertGuest(guest); err != nil { +func (s *Store) Add(guest Guest) error { + if err := s.insertGuest(guest); err != nil { return err } - return store.insertParty(guest) + return s.insertParty(guest) } -func (store Store) insertGuest(guest Guest) error { +func (s *Store) insertGuest(guest Guest) error { statement := `insert into guest (id, first_name, last_name, attendance, email, message, party_size) values ($1, $2, $3, $4, $5, $6, $7)` - _, err := store.database.Exec(context.Background(), statement, guest.Id, + _, err := s.database.Exec(context.Background(), statement, guest.Id, guest.FirstName, guest.LastName, guest.Attendance, guest.Email, guest.Message, guest.PartySize) return err } -func (store Store) Update(guest Guest) error { - if err := store.updateGuest(guest); err != nil { +func (s *Store) Update(guest Guest) error { + if err := s.updateGuest(guest); err != nil { return err } - if err := store.deleteParty(guest.Id); err != nil { + if err := s.deleteParty(guest.Id); err != nil { return err } - return store.insertParty(guest) + return s.insertParty(guest) } -func (store Store) updateGuest(guest Guest) error { +func (s *Store) updateGuest(guest Guest) error { statement := `update guest set attendance = $1, email = $2, message = $3, party_size = $4 where id = $5` - _, err := store.database.Exec(context.Background(), statement, + _, err := s.database.Exec(context.Background(), statement, guest.Attendance, guest.Email, guest.Message, guest.PartySize, guest.Id) return err } -func (store Store) deleteParty(guestId string) error { +func (s *Store) deleteParty(guestId string) error { statement := "delete from party where guest_id = $1" - _, err := store.database.Exec(context.Background(), statement, guestId) + _, err := s.database.Exec(context.Background(), statement, guestId) return err } -func (store Store) insertParty(guest Guest) error { +func (s *Store) insertParty(guest Guest) error { statement := `insert into party (guest_id, first_name, last_name) values ($1, $2, $3)` for _, pg := range guest.PartyList { - _, err := store.database.Exec(context.Background(), statement, guest.Id, + _, err := s.database.Exec(context.Background(), statement, guest.Id, pg.FirstName, pg.LastName) if err != nil { return err @@ -190,18 +185,18 @@ func (store Store) insertParty(guest Guest) error { return nil } -func (store Store) Delete(guestId string) error { - if err := store.deleteGuest(guestId); err != nil { +func (s *Store) Delete(guestId string) error { + if err := s.deleteGuest(guestId); err != nil { return err } - if err := store.deleteParty(guestId); err != nil { + if err := s.deleteParty(guestId); err != nil { return err } return nil } -func (store Store) deleteGuest(guestId string) error { +func (s *Store) deleteGuest(guestId string) error { statement := "delete from guest where id = $1" - _, err := store.database.Exec(context.Background(), statement, guestId) + _, err := s.database.Exec(context.Background(), statement, guestId) return err } |