added validaton for assigning users to events

This commit is contained in:
z1glr
2025-01-27 22:48:18 +00:00
parent 553928062f
commit 89ec2312f8
5 changed files with 38 additions and 14 deletions

View File

@@ -4,8 +4,10 @@ import (
"github.com/johannesbuehl/golunteer/backend/pkg/db" "github.com/johannesbuehl/golunteer/backend/pkg/db"
) )
type AvailabilityID int
type AvailabilityDB struct { type AvailabilityDB struct {
AvailabilityID int `db:"availabilityID" json:"availabilityID" validate:"required"` AvailabilityID AvailabilityID `db:"availabilityID" json:"availabilityID" validate:"required"`
Availability `validate:"required"` Availability `validate:"required"`
} }
@@ -38,12 +40,12 @@ func Slice() ([]AvailabilityDB, error) {
} }
} }
func Keys() (map[int]Availability, error) { func Keys() (map[AvailabilityID]Availability, error) {
if availabilitiesRaw, err := Slice(); err != nil { if availabilitiesRaw, err := Slice(); err != nil {
return nil, err return nil, err
} else { } else {
// convert the result in a map // convert the result in a map
availabilities := map[int]Availability{} availabilities := map[AvailabilityID]Availability{}
for _, a := range availabilitiesRaw { for _, a := range availabilitiesRaw {
availabilities[a.AvailabilityID] = Availability{ availabilities[a.AvailabilityID] = Availability{

View File

@@ -235,6 +235,18 @@ func WithAvailabilities() ([]EventWithAvailabilities, error) {
} }
} }
func GetUserAvailability(eventID int, userName string) (*availabilities.AvailabilityID, error) {
var availabilityID struct {
AvailabilityID *availabilities.AvailabilityID `db:"availabilityID"`
}
if err := db.DB.QueryRowx("SELECT availabilityID FROM USER_AVAILABILITIES WHERE eventID = $1 AND userName = $2", eventID, userName).StructScan(&availabilityID); err != nil {
return availabilityID.AvailabilityID, err
} else {
return availabilityID.AvailabilityID, nil
}
}
func WithUserAvailability(userName string) ([]EventWithAssignmentsUserAvailability, error) { func WithUserAvailability(userName string) ([]EventWithAssignmentsUserAvailability, error) {
var events []EventWithAssignmentsUserAvailability var events []EventWithAssignmentsUserAvailability
@@ -325,7 +337,7 @@ func User(userName string) ([]EventWithAssignments, error) {
} }
// set the availability of an user for a specific event // set the availability of an user for a specific event
func UserAvailability(eventID, availabilityID int, userName string) error { func SetUserAvailability(eventID, availabilityID int, userName string) error {
_, err := db.DB.Exec("INSERT INTO USER_AVAILABILITIES (userName, eventID, availabilityID) VALUES ($1, $2, $3) ON CONFLICT (userName, eventID) DO UPDATE SET availabilityID = $3", userName, eventID, availabilityID) _, err := db.DB.Exec("INSERT INTO USER_AVAILABILITIES (userName, eventID, availabilityID) VALUES ($1, $2, $3) ON CONFLICT (userName, eventID) DO UPDATE SET availabilityID = $3", userName, eventID, availabilityID)
return err return err

View File

@@ -146,12 +146,14 @@ func (a *Handler) putEventUserAvailability() {
a.Status = fiber.StatusBadRequest a.Status = fiber.StatusBadRequest
logger.Log().Msgf("setting user-event-availability failed: can't get parse: %v", err) logger.Log().Msgf("setting user-event-availability failed: can't get parse: %v", err)
} else {
// if there was already an availability entered for this user-event-combi, check for existing assignments and remove them
// insert the availability into the database // insert the availability into the database
} else if err := events.UserAvailability(eventID, availabilityID, a.UserName); err != nil { if err := events.SetUserAvailability(eventID, availabilityID, a.UserName); err != nil {
a.Status = fiber.StatusInternalServerError a.Status = fiber.StatusInternalServerError
logger.Error().Msgf("setting user-event-availability failed: can't write availability to database: %v", err) logger.Error().Msgf("setting user-event-availability failed: can't write availability to database: %v", err)
}
} }
} }
} }
@@ -173,13 +175,22 @@ func (a *Handler) putEventAssignment() {
} else if taskID := a.C.QueryInt("taskID", -1); taskID == -1 { } else if taskID := a.C.QueryInt("taskID", -1); taskID == -1 {
a.Status = fiber.StatusBadRequest a.Status = fiber.StatusBadRequest
logger.Warn().Msg("setting event-assignment failed: query is missing \"taskID\"") logger.Log().Msg("setting event-assignment failed: query is missing \"taskID\"")
// parse the body // parse the body
} else if userName := string(a.C.Body()); userName == "" { } else if userName := string(a.C.Body()); userName == "" {
a.Status = fiber.StatusBadRequest a.Status = fiber.StatusBadRequest
logger.Warn().Msg("setting event-assignment failed: body is missing") logger.Log().Msg("setting event-assignment failed: body is missing")
// check wether the user has actually entered an availability for the event
} else if availabilityID, err := events.GetUserAvailability(eventID, userName); err != nil {
a.Status = fiber.StatusBadRequest
logger.Log().Msgf("setting event-assignment failed: can't check users availability: %v", err)
} else if availabilityID == nil {
a.Status = fiber.StatusConflict
logger.Log().Msgf("setting event-assignment failed: user %q isn't available for event with eventID = %d", userName, eventID)
// set the availability in the database // set the availability in the database
} else if err := events.SetAssignment(eventID, taskID, userName); err != nil { } else if err := events.SetAssignment(eventID, taskID, userName); err != nil {
@@ -187,7 +198,6 @@ func (a *Handler) putEventAssignment() {
logger.Warn().Msgf("setting event-assignment failed: can't write to database: %v", err) logger.Warn().Msgf("setting event-assignment failed: can't write to database: %v", err)
} }
} }
func (a *Handler) deleteEventAssignment() { func (a *Handler) deleteEventAssignment() {

View File

@@ -146,10 +146,10 @@ func init() {
args.Status = fiber.StatusUnauthorized args.Status = fiber.StatusUnauthorized
logger.Log().Msgf("user not authorized") logger.Log().Msgf("user not authorized")
} else {
handler(&args)
} }
handler(&args)
return args.send(c) return args.send(c)
}) })
} }

View File

@@ -15,7 +15,7 @@ CREATE TABLE IF NOT EXISTS USERS (
userName varchar(64) PRIMARY KEY, userName varchar(64) PRIMARY KEY,
password BLOB NOT NULL, password BLOB NOT NULL,
admin BOOL NOT NULL DEFAULT(false), admin BOOL NOT NULL DEFAULT(false),
tokenID varchar(64) NOT NULL, tokenID varchar(36) NOT NULL,
CHECK (length(password) = 60), CHECK (length(password) = 60),
CHECK (length(tokenID) = 36) CHECK (length(tokenID) = 36)
); );