added validaton for assigning users to events
This commit is contained in:
@@ -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{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -146,14 +146,16 @@ 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() {
|
||||
@@ -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() {
|
||||
|
||||
@@ -146,9 +146,9 @@ func init() {
|
||||
args.Status = fiber.StatusUnauthorized
|
||||
|
||||
logger.Log().Msgf("user not authorized")
|
||||
}
|
||||
|
||||
} else {
|
||||
handler(&args)
|
||||
}
|
||||
|
||||
return args.send(c)
|
||||
})
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user