added validaton for assigning users to events
This commit is contained in:
@@ -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{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -146,15 +146,17 @@ 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (a *Handler) putEventAssignment() {
|
func (a *Handler) putEventAssignment() {
|
||||||
// check admin
|
// check admin
|
||||||
@@ -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() {
|
||||||
|
|||||||
@@ -146,9 +146,9 @@ 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)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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)
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user