summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/src/components/AdminLogin.tsx6
-rw-r--r--client/src/components/GuestLogin.tsx6
-rw-r--r--client/src/components/RsvpForm.tsx20
-rw-r--r--client/src/models.ts10
-rw-r--r--client/src/slices/api/adminSlice.ts4
-rw-r--r--client/src/slices/api/guestSlice.ts12
-rw-r--r--server/admin/handler.go4
-rw-r--r--server/admin/models.go2
-rw-r--r--server/guest/handler.go26
-rw-r--r--server/guest/models.go27
-rw-r--r--server/guest/store.go14
-rw-r--r--server/test/guest_test.go8
12 files changed, 65 insertions, 74 deletions
diff --git a/client/src/components/AdminLogin.tsx b/client/src/components/AdminLogin.tsx
index 92e5335..4f53566 100644
--- a/client/src/components/AdminLogin.tsx
+++ b/client/src/components/AdminLogin.tsx
@@ -5,7 +5,7 @@ import { Button, Paper, TextField, Typography } from '@mui/material';
import { useForm } from 'react-hook-form';
import { setAdmin } from '../slices/auth/adminSlice';
import { useLoginAdminMutation } from '../slices/api/adminSlice';
-import type { AdminLoginRequest } from '../models';
+import type { Credentials } from '../models';
function GuestLogin() {
const dispatch = useDispatch();
@@ -16,14 +16,14 @@ function GuestLogin() {
register,
handleSubmit,
formState: { errors },
- } = useForm<AdminLoginRequest>({
+ } = useForm<Credentials>({
defaultValues: {
username: '',
password: '',
},
});
- const onSubmit = async (data: AdminLoginRequest) => {
+ const onSubmit = async (data: Credentials) => {
try {
dispatch(setAdmin(await login(data).unwrap()));
navigate('/dashboard');
diff --git a/client/src/components/GuestLogin.tsx b/client/src/components/GuestLogin.tsx
index 0e47384..f42c1d6 100644
--- a/client/src/components/GuestLogin.tsx
+++ b/client/src/components/GuestLogin.tsx
@@ -5,7 +5,7 @@ import { Button, Paper, TextField, Typography } from '@mui/material';
import { useForm } from 'react-hook-form';
import { setGuest } from '../slices/auth/guestSlice';
import { useLoginGuestMutation } from '../slices/api/guestSlice';
-import type { GuestLoginRequest } from '../slices/api/guestSlice';
+import type { Name } from '../models';
function GuestLogin() {
const dispatch = useDispatch();
@@ -16,14 +16,14 @@ function GuestLogin() {
register,
handleSubmit,
formState: { errors },
- } = useForm<GuestLoginRequest>({
+ } = useForm<Name>({
defaultValues: {
firstName: '',
lastName: '',
},
});
- const onSubmit = async (data: GuestLoginRequest) => {
+ const onSubmit = async (data: Name) => {
try {
dispatch(setGuest(await login(data).unwrap()));
navigate('/rsvp');
diff --git a/client/src/components/RsvpForm.tsx b/client/src/components/RsvpForm.tsx
index c7c30f4..b3ed3b3 100644
--- a/client/src/components/RsvpForm.tsx
+++ b/client/src/components/RsvpForm.tsx
@@ -37,10 +37,10 @@ const Status = ({ isError, setOpen }: StatusProps) => {
};
function RsvpForm() {
- const [updateGuest, { isLoading, isSuccess, isError, error }] =
+ const [updateGuest, { isLoading, isSuccess, isError }] =
useUpdateGuestMutation();
const guest: Guest = useOutletContext();
- const previousPartySize = useRef(guest?.partySize - 1);
+ const previousPartySize = useRef(guest.partySize ?? 1 - 1);
const [open, setOpen] = useState<boolean>(false);
useEffect(() => {
@@ -55,14 +55,14 @@ function RsvpForm() {
formState: { errors },
} = useForm<Guest>({
defaultValues: {
- id: guest?.id,
- firstName: guest?.firstName,
- lastName: guest?.lastName,
- attendance: guest?.attendance,
- email: guest?.email,
- message: guest?.message,
- partySize: guest?.partySize,
- partyList: guest?.partyList,
+ id: guest.id,
+ firstName: guest.firstName,
+ lastName: guest.lastName,
+ attendance: guest.attendance,
+ email: guest.email,
+ message: guest.message,
+ partySize: guest.partySize,
+ partyList: guest.partyList,
},
});
diff --git a/client/src/models.ts b/client/src/models.ts
index 2580d90..6840a46 100644
--- a/client/src/models.ts
+++ b/client/src/models.ts
@@ -6,25 +6,25 @@ export interface Guest {
email?: string;
message?: string;
partySize?: number;
- partyList?: Array<Guest>;
+ partyList?: Array<Name>;
}
-export interface GuestLoginRequest {
+export interface Name {
firstName: string;
lastName: string;
}
-export interface GuestLoginResponse {
+export interface GuestLogin {
guest: Guest;
token: string;
}
-export interface AdminLoginRequest {
+export interface Credentials {
username: string;
password: string;
}
-export interface AdminLoginResponse {
+export interface AdminLogin {
guests: Guest[];
token: string;
}
diff --git a/client/src/slices/api/adminSlice.ts b/client/src/slices/api/adminSlice.ts
index bd69502..5de5c4d 100644
--- a/client/src/slices/api/adminSlice.ts
+++ b/client/src/slices/api/adminSlice.ts
@@ -1,6 +1,6 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import type { RootState } from '../../store';
-import type { AdminLoginRequest, AdminLoginResponse } from '../../models';
+import type { Credentials, AdminLogin } from '../../models';
export const adminSlice = createApi({
reducerPath: 'adminApi',
@@ -15,7 +15,7 @@ export const adminSlice = createApi({
},
}),
endpoints: (builder) => ({
- loginAdmin: builder.mutation<AdminLoginResponse, AdminLoginRequest>({
+ loginAdmin: builder.mutation<AdminLogin, Credentials>({
query: (credentials) => ({
url: 'admin/login',
method: 'POST',
diff --git a/client/src/slices/api/guestSlice.ts b/client/src/slices/api/guestSlice.ts
index a7dbcc4..312a665 100644
--- a/client/src/slices/api/guestSlice.ts
+++ b/client/src/slices/api/guestSlice.ts
@@ -1,10 +1,6 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import type { RootState } from '../../store';
-import type {
- Guest,
- GuestLoginRequest,
- GuestLoginResponse,
-} from '../../models';
+import type { Guest, Name, GuestLogin } from '../../models';
export const guestSlice = createApi({
reducerPath: 'guestApi',
@@ -19,11 +15,11 @@ export const guestSlice = createApi({
},
}),
endpoints: (builder) => ({
- loginGuest: builder.mutation<GuestLoginResponse, GuestLoginRequest>({
- query: (credentials) => ({
+ loginGuest: builder.mutation<GuestLogin, Name>({
+ query: (name) => ({
url: 'login',
method: 'POST',
- body: credentials,
+ body: name,
}),
}),
updateGuest: builder.mutation<Guest, Guest>({
diff --git a/server/admin/handler.go b/server/admin/handler.go
index 5fd1fee..f2d5807 100644
--- a/server/admin/handler.go
+++ b/server/admin/handler.go
@@ -114,6 +114,6 @@ func (adminHandler *AdminHandler) marshalResponse(guests []guest.Guest, token st
return json.Marshal(loginResponse)
}
-func (adminHandler *AdminHandler) createLoginResponse(guests []guest.Guest, token string) *LoginResponse {
- return &LoginResponse{guests, token}
+func (adminHandler *AdminHandler) createLoginResponse(guests []guest.Guest, token string) *Login {
+ return &Login{guests, token}
}
diff --git a/server/admin/models.go b/server/admin/models.go
index d9b8232..1699381 100644
--- a/server/admin/models.go
+++ b/server/admin/models.go
@@ -15,7 +15,7 @@ type Claims struct {
jwt.RegisteredClaims
}
-type LoginResponse struct {
+type Login struct {
Guests []guest.Guest `json:"guests"`
Token string `json:"token"`
}
diff --git a/server/guest/handler.go b/server/guest/handler.go
index a14a039..e4ba3f3 100644
--- a/server/guest/handler.go
+++ b/server/guest/handler.go
@@ -22,7 +22,7 @@ type GuestHandler struct {
}
type GuestStore interface {
- Find(credentials Credentials) (Guest, error)
+ Find(name Name) (Guest, error)
Get() ([]Guest, error)
Add(guest Guest) error
Update(guest Guest) error
@@ -103,16 +103,16 @@ func (handler *GuestHandler) handleDelete(responseWriter http.ResponseWriter, re
}
func (handler *GuestHandler) logIn(request *http.Request) ([]byte, *appError) {
- credentials, err := handler.decodeCredentials(request)
+ name, err := handler.decodeName(request)
if err != nil {
- return []byte{}, &appError{err, "failed to unmarshal credentials", http.StatusBadRequest}
+ return []byte{}, &appError{err, "failed to unmarshal name", http.StatusBadRequest}
}
- guest, err := handler.store.Find(credentials)
+ guest, err := handler.store.Find(name)
if err != nil {
return []byte{}, &appError{err, "guest not found", http.StatusUnauthorized}
}
expirationTime := handler.setExpirationTime()
- claims := handler.createClaims(credentials, expirationTime)
+ claims := handler.createClaims(name, expirationTime)
key, err := handler.readGuestKey()
if err != nil {
return []byte{}, &appError{err, "failed to read secret key", http.StatusInternalServerError}
@@ -128,20 +128,20 @@ func (handler *GuestHandler) logIn(request *http.Request) ([]byte, *appError) {
return jsonBytes, nil
}
-func (handler *GuestHandler) decodeCredentials(request *http.Request) (Credentials, error) {
- var credentials Credentials
- err := json.NewDecoder(request.Body).Decode(&credentials)
+func (handler *GuestHandler) decodeName(request *http.Request) (Name, error) {
+ var name Name
+ err := json.NewDecoder(request.Body).Decode(&name)
defer request.Body.Close()
- return credentials, err
+ return name, err
}
func (handler *GuestHandler) setExpirationTime() time.Time {
return time.Now().Add(15 * time.Minute)
}
-func (handler *GuestHandler) createClaims(credentials Credentials, expirationTime time.Time) *Claims {
+func (handler *GuestHandler) createClaims(name Name, expirationTime time.Time) *Claims {
return &Claims{
- Credentials: credentials,
+ Name: name,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expirationTime),
},
@@ -167,8 +167,8 @@ func (handler *GuestHandler) marshalResponse(guest Guest, token string) ([]byte,
return json.Marshal(loginResponse)
}
-func (handler *GuestHandler) createLoginResponse(weddingGuest Guest, token string) *LoginResponse {
- return &LoginResponse{
+func (handler *GuestHandler) createLoginResponse(weddingGuest Guest, token string) *Login {
+ return &Login{
Guest: weddingGuest,
Token: token,
}
diff --git a/server/guest/models.go b/server/guest/models.go
index f792789..d93bd53 100644
--- a/server/guest/models.go
+++ b/server/guest/models.go
@@ -3,32 +3,27 @@ package guest
import "github.com/golang-jwt/jwt/v5"
type Guest struct {
- ID int `json:"id"`
- FirstName string `json:"firstName"`
- LastName string `json:"lastName"`
- Attendance string `json:"attendance"`
- Email string `json:"email"`
- Message string `json:"message"`
- PartySize int `json:"partySize"`
- PartyList []PartyMember `json:"partyList"`
+ ID int `json:"id"`
+ FirstName string `json:"firstName"`
+ LastName string `json:"lastName"`
+ Attendance string `json:"attendance"`
+ Email string `json:"email"`
+ Message string `json:"message"`
+ PartySize int `json:"partySize"`
+ PartyList []Name `json:"partyList"`
}
-type PartyMember struct {
- FirstName string `json:"firstName"`
- LastName string `json:"lastName"`
-}
-
-type Credentials struct {
+type Name struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
}
type Claims struct {
- Credentials Credentials `json:"credentials"`
+ Name Name `json:"name"`
jwt.RegisteredClaims
}
-type LoginResponse struct {
+type Login struct {
Guest Guest `json:"guest"`
Token string `json:"token"`
}
diff --git a/server/guest/store.go b/server/guest/store.go
index 44fa6d7..16123e3 100644
--- a/server/guest/store.go
+++ b/server/guest/store.go
@@ -18,14 +18,14 @@ func NewStore(database *pgxpool.Pool) *Store {
}
}
-func (store Store) Find(credentials Credentials) (Guest, error) {
+func (store Store) Find(name Name) (Guest, error) {
guestRows, err := store.database.Query(context.Background(),
"select * from guest")
if err != nil {
return Guest{}, err
}
defer guestRows.Close()
- guest, found := createGuest(credentials, guestRows)
+ guest, found := createGuest(name, guestRows)
partyRows, err := store.database.Query(context.Background(),
"select * from party")
@@ -45,7 +45,7 @@ func (store Store) Find(credentials Credentials) (Guest, error) {
return Guest{}, errors.New("guest not found")
}
-func createGuest(credentials Credentials, guestRows pgx.Rows) (Guest, bool) {
+func createGuest(name Name, guestRows pgx.Rows) (Guest, bool) {
var guest Guest
for guestRows.Next() {
err := guestRows.Scan(&guest.ID, &guest.FirstName, &guest.LastName,
@@ -53,8 +53,8 @@ func createGuest(credentials Credentials, guestRows pgx.Rows) (Guest, bool) {
if err != nil {
return Guest{}, false
}
- if guest.FirstName == credentials.FirstName &&
- guest.LastName == credentials.LastName {
+ if guest.FirstName == name.FirstName &&
+ guest.LastName == name.LastName {
return guest, true
}
}
@@ -65,7 +65,7 @@ func addParty(guestWithoutParty Guest, partyRows pgx.Rows) (Guest, error) {
guestWithParty := guestWithoutParty
for partyRows.Next() {
var guestID int
- var partyMember PartyMember
+ var partyMember Name
err := partyRows.Scan(&guestID, &partyMember.FirstName, &partyMember.LastName)
if err != nil {
return Guest{}, err
@@ -123,7 +123,7 @@ func addPartySlice(guestsWithoutParty []Guest,
guestsWithParty := guestsWithoutParty
for partyRows.Next() {
var guestID int
- var partyMember PartyMember
+ var partyMember Name
err := partyRows.Scan(&guestID, &partyMember.FirstName, &partyMember.LastName)
if err != nil {
return []Guest{}, err
diff --git a/server/test/guest_test.go b/server/test/guest_test.go
index 4609d57..a5e8e8d 100644
--- a/server/test/guest_test.go
+++ b/server/test/guest_test.go
@@ -63,7 +63,7 @@ func TestUpdateRSVP(test *testing.T) {
deleteGuest(guestHandler, adminToken, test)
}
-func logInGuest(guestHandler *guest.GuestHandler, test *testing.T) guest.LoginResponse {
+func logInGuest(guestHandler *guest.GuestHandler, test *testing.T) guest.Login {
response := httptest.NewRecorder()
loginRequest, err := http.NewRequest(http.MethodPost,
"http://localhost:8080/guests/login", strings.NewReader(getName()))
@@ -72,7 +72,7 @@ func logInGuest(guestHandler *guest.GuestHandler, test *testing.T) guest.LoginRe
}
guestHandler.ServeHTTP(response, loginRequest)
assertEquals(test, response.Result().StatusCode, 200)
- var login guest.LoginResponse
+ var login guest.Login
if err = json.NewDecoder(response.Body).Decode(&login); err != nil {
log.Fatal(err)
}
@@ -91,7 +91,7 @@ func addPartyMember(guestHandler *guest.GuestHandler, token string, test *testin
assertEquals(test, response.Result().StatusCode, 200)
}
-func logInAdmin(adminHandler *admin.AdminHandler, test *testing.T) admin.LoginResponse {
+func logInAdmin(adminHandler *admin.AdminHandler, test *testing.T) admin.Login {
response := httptest.NewRecorder()
loginRequest, err := http.NewRequest(http.MethodPost,
"http://localhost:8080/admin/login", strings.NewReader(getCredentials()))
@@ -100,7 +100,7 @@ func logInAdmin(adminHandler *admin.AdminHandler, test *testing.T) admin.LoginRe
}
adminHandler.ServeHTTP(response, loginRequest)
assertEquals(test, response.Result().StatusCode, 200)
- var login admin.LoginResponse
+ var login admin.Login
if err = json.NewDecoder(response.Body).Decode(&login); err != nil {
log.Fatal(err)
}