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"
)
type AvailabilityID int
type AvailabilityDB struct {
AvailabilityID int `db:"availabilityID" json:"availabilityID" validate:"required"`
AvailabilityID AvailabilityID `db:"availabilityID" json:"availabilityID" 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 {
return nil, err
} else {
// convert the result in a map
availabilities := map[int]Availability{}
availabilities := map[AvailabilityID]Availability{}
for _, a := range availabilitiesRaw {
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) {
var events []EventWithAssignmentsUserAvailability
@@ -325,7 +337,7 @@ func User(userName string) ([]EventWithAssignments, error) {
}
// 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)
return err

View File

@@ -146,15 +146,17 @@ func (a *Handler) putEventUserAvailability() {
a.Status = fiber.StatusBadRequest
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
} 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
logger.Error().Msgf("setting user-event-availability failed: can't write availability to database: %v", err)
}
}
}
}
func (a *Handler) putEventAssignment() {
// check admin
@@ -173,13 +175,22 @@ func (a *Handler) putEventAssignment() {
} else if taskID := a.C.QueryInt("taskID", -1); taskID == -1 {
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
} else if userName := string(a.C.Body()); userName == "" {
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
} 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)
}
}
func (a *Handler) deleteEventAssignment() {

View File

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

View File

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