fixed assignments view once again

This commit is contained in:
z1glr
2025-01-21 09:41:27 +00:00
parent c9fb212386
commit 67a4001883
29 changed files with 695 additions and 449 deletions

View File

@@ -4,27 +4,19 @@ import (
"github.com/johannesbuehl/golunteer/backend/pkg/db"
)
type assignments map[string]*string
type eventAssignmentDB struct {
TaskName string `db:"taskName"`
UserName *string `db:"userName"`
type EventAssignment struct {
TaskID int `db:"taskID" json:"taskID"`
TaskName string `db:"taskName" json:"taskName"`
UserName *string `db:"userName" json:"userName"`
}
func Event(eventID int) (assignments, error) {
func Event(eventID int) ([]EventAssignment, error) {
// get the assignments from the database
var assignmentRows []eventAssignmentDB
var assignmentRows []EventAssignment
if err := db.DB.Select(&assignmentRows, "SELECT USERS.name AS userName, TASKS.text AS taskName FROM USER_ASSIGNMENTS LEFT JOIN USERS ON USER_ASSIGNMENTS.userName = USERS.name LEFT JOIN TASKS ON USER_ASSIGNMENTS.taskID = TASKS.id WHERE USER_ASSIGNMENTS.eventID = ?", eventID); err != nil {
if err := db.DB.Select(&assignmentRows, "SELECT USERS.name AS userName, taskID, TASKS.name AS taskName FROM USER_ASSIGNMENTS LEFT JOIN USERS ON USER_ASSIGNMENTS.userName = USERS.name LEFT JOIN TASKS ON USER_ASSIGNMENTS.taskID = TASKS.id WHERE USER_ASSIGNMENTS.eventID = ?", eventID); err != nil {
return nil, err
} else {
// transform the rows into the returned map
eventAssignments := assignments{}
for _, assignment := range assignmentRows {
eventAssignments[assignment.TaskName] = assignment.UserName
}
return eventAssignments, nil
return assignmentRows, nil
}
}

View File

@@ -10,19 +10,19 @@ type AvailabilityDB struct {
}
type Availability struct {
Text string `db:"text" json:"text" validate:"required"`
Name string `db:"name" json:"name" validate:"required"`
Enabled bool `db:"enabled" json:"enabled" validate:"required"`
Color string `db:"color" json:"color" validate:"required"`
}
func Add(a Availability) error {
_, err := db.DB.NamedExec("INSERT INTO AVAILABILITIES (text, color, enabled) VALUES (:text, :color, :enabled)", a)
_, err := db.DB.NamedExec("INSERT INTO AVAILABILITIES (name, color, enabled) VALUES (:name, :color, :enabled)", a)
return err
}
func Update(a AvailabilityDB) error {
_, err := db.DB.NamedExec("UPDATE AVAILABILITIES SET text = :text, color = :color, enabled = :enabled WHERE id = :id", a)
_, err := db.DB.NamedExec("UPDATE AVAILABILITIES SET name = :name, color = :color, enabled = :enabled WHERE id = :id", a)
return err
}
@@ -47,7 +47,7 @@ func Keys() (map[int]Availability, error) {
for _, a := range availabilitiesRaw {
availabilities[a.Id] = Availability{
Text: a.Text,
Name: a.Name,
Enabled: a.Enabled,
Color: a.Color,
}
@@ -56,3 +56,9 @@ func Keys() (map[int]Availability, error) {
return availabilities, nil
}
}
func Delete(id int) error {
_, err := db.DB.Exec("DELETE FROM AVAILABILITIES WHERE id = $1", id)
return err
}

View File

@@ -24,7 +24,7 @@ func Event(eventID int) (map[string]string, error) {
return nil, err
} else {
for _, a := range availabilitiesRows {
eventAvailabilities[a.UserName] = availabilitiesMap[a.AvailabilityID].Text
eventAvailabilities[a.UserName] = availabilitiesMap[a.AvailabilityID].Name
}
return eventAvailabilities, nil

View File

@@ -19,6 +19,8 @@ func init() {
// connect to the database
DB = sqlx.MustOpen("sqlite", config.Database)
DB.MustExec("PRAGMA foreign_keys = ON")
// create the tables if they don't exist
if dbSetupInstructions, err := os.ReadFile("setup.sql"); err != nil {
panic("can't read database-setup")

View File

@@ -11,7 +11,7 @@ import (
type EventWithAssignment struct {
eventDataDB
Tasks map[string]*string `json:"tasks"`
Tasks []assignments.EventAssignment `json:"tasks"`
}
type EventWithAvailabilities struct {
@@ -61,6 +61,7 @@ type EventCreate struct {
}
func Create(event EventCreate) error {
// convert the date to utc
if result, err := db.DB.NamedExec("INSERT INTO EVENTS (date, description) VALUES (:date, :description)", event); err != nil {
return err
} else if id, err := result.LastInsertId(); err != nil {
@@ -160,7 +161,7 @@ func Update(event EventPatch) error {
func All() ([]eventDataDB, error) {
var dbRows []eventDataDB
if err := db.DB.Select(&dbRows, "SELECT *, DATE_FORMAT(date, '%Y-%m-%dT%H:%i:%s') as date FROM EVENTS"); err != nil {
if err := db.DB.Select(&dbRows, "SELECT * FROM EVENTS"); err != nil {
return nil, err
} else {
return dbRows, nil

View File

@@ -10,7 +10,7 @@ type TaskDB struct {
}
type Task struct {
Text string `json:"text" db:"text" validate:"required"`
Name string `json:"name" db:"name" validate:"required"`
Enabled bool `json:"enabled" db:"enabled" validate:"required"`
}
@@ -34,7 +34,7 @@ func GetMap() (map[int]Task, error) {
for _, a := range tasksRaw {
tasks[a.ID] = Task{
Text: a.Text,
Name: a.Name,
Enabled: a.Enabled,
}
}
@@ -44,13 +44,19 @@ func GetMap() (map[int]Task, error) {
}
func Add(t Task) error {
_, err := db.DB.NamedExec("INSERT INTO TASKS (text, enabled) VALUES (:text, :enabled)", &t)
_, err := db.DB.NamedExec("INSERT INTO TASKS (name, enabled) VALUES (:name, :enabled)", &t)
return err
}
func Update(t TaskDB) error {
_, err := db.DB.NamedExec("UPDATE TASKS set text = :text, enabled = :enabled WHERE id = :id", &t)
_, err := db.DB.NamedExec("UPDATE TASKS set name = :name, enabled = :enabled WHERE id = :id", &t)
return err
}
func Delete(i int) error {
_, err := db.DB.Exec("DELETE FROM TASKS WHERE id = $1", i)
return err
}

View File

@@ -16,15 +16,13 @@ func getAvailabilities(args HandlerArgs) responseMessage {
return response
} else {
response.Data = struct {
Availabilities []availabilities.AvailabilityDB `json:"availabilities"`
}{Availabilities: avails}
response.Data = avails
return response
}
}
func postAvailabilitie(args HandlerArgs) responseMessage {
func postAvailability(args HandlerArgs) responseMessage {
response := responseMessage{}
// check admin
@@ -65,7 +63,7 @@ func postAvailabilitie(args HandlerArgs) responseMessage {
}
}
func patchAvailabilities(args HandlerArgs) responseMessage {
func patchAvailabilitiy(args HandlerArgs) responseMessage {
response := responseMessage{}
// check admin
@@ -105,3 +103,32 @@ func patchAvailabilities(args HandlerArgs) responseMessage {
}
}
}
func deleteAvailability(args HandlerArgs) responseMessage {
// check admin
if !args.User.Admin {
logger.Warn().Msg("availability-deletion failed: user is no admin")
return responseMessage{
Status: fiber.StatusUnauthorized,
}
// parse the query
} else if taskID := args.C.QueryInt("id", -1); taskID == -1 {
logger.Log().Msg("availability-deletion failed: invalid query: doesn't include \"id\"")
return responseMessage{
Status: fiber.StatusBadRequest,
}
// delete the task from the database
} else if err := availabilities.Delete(taskID); err != nil {
logger.Error().Msgf("availability-deletion failed: can't delete task from database: %v", err)
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
return responseMessage{}
}
}

View File

@@ -118,18 +118,31 @@ func getEventsUserPending(args HandlerArgs) responseMessage {
}
func deleteEvent(args HandlerArgs) responseMessage {
response := responseMessage{}
// check for admin
if !args.User.Admin {
response.Status = fiber.StatusForbidden
logger.Warn().Msg("event-delete failed: user is no admin")
return responseMessage{
Status: fiber.StatusForbidden,
}
// -1 can't be valid
} else if eventId := args.C.QueryInt("id", -1); eventId == -1 {
response.Status = fiber.StatusBadRequest
} else if err := events.Delete(eventId); err != nil {
response.Status = fiber.StatusInternalServerError
}
logger.Log().Msgf("event-delete failed: \"id\" is missing in query")
return response
return responseMessage{
Status: fiber.StatusBadRequest,
}
} else if err := events.Delete(eventId); err != nil {
logger.Error().Msgf("event-delete failed: can't delete from database: %v", err)
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
logger.Log().Msgf("deleted event with id %d", eventId)
return responseMessage{}
}
}

View File

@@ -86,20 +86,22 @@ func init() {
"POST": {
"events": postEvent,
"users": postUser,
"availabilities": postAvailabilitie,
"availabilities": postAvailability,
"tasks": postTask,
},
"PATCH": {
"users": patchUser,
"events": patchEvent,
"availabilities": patchAvailabilities,
"availabilities": patchAvailabilitiy,
"tasks": patchTask,
},
"PUT": {
"users/password": putPassword,
},
"DELETE": {
"event": deleteEvent,
"event": deleteEvent,
"tasks": deleteTask,
"availabilities": deleteAvailability,
},
}

View File

@@ -6,32 +6,15 @@ import (
)
func getTasks(args HandlerArgs) responseMessage {
// check wether the "map"-query is given
if args.C.QueryBool("map") {
if tasks, err := tasks.GetMap(); err != nil {
logger.Error().Msgf("can't get tasks: %v", err)
if taskSlice, err := tasks.GetSlice(); err != nil {
logger.Error().Msgf("can't get tasks: %v", err)
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
return responseMessage{
Data: tasks,
}
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
if taskSlice, err := tasks.GetSlice(); err != nil {
logger.Error().Msgf("can't get tasks: %v", err)
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
return responseMessage{
Data: struct {
Tasks []tasks.TaskDB `json:"tasks"`
}{Tasks: taskSlice},
}
return responseMessage{
Data: taskSlice,
}
}
}
@@ -115,3 +98,32 @@ func patchTask(args HandlerArgs) responseMessage {
}
}
}
func deleteTask(args HandlerArgs) responseMessage {
// check admin
if !args.User.Admin {
logger.Warn().Msg("task-deletion failed: user is no admin")
return responseMessage{
Status: fiber.StatusUnauthorized,
}
// parse the query
} else if taskID := args.C.QueryInt("id", -1); taskID == -1 {
logger.Log().Msg("task-deletion failed: invalid query: doesn't include \"id\"")
return responseMessage{
Status: fiber.StatusBadRequest,
}
// delete the task from the database
} else if err := tasks.Delete(taskID); err != nil {
logger.Error().Msgf("task-deletion failed: can't delete task from database: %v", err)
return responseMessage{
Status: fiber.StatusInternalServerError,
}
} else {
return responseMessage{}
}
}

View File

@@ -1,19 +1,19 @@
CREATE TABLE IF NOT EXISTS TASKS (
id INTEGER PRIMARY KEY,
text varchar(64) NOT NULL,
enabled BOOL DEFAULT(true)
name varchar(64) NOT NULL,
enabled BOOL DEFAULT 1
);
CREATE TABLE IF NOT EXISTS AVAILABILITIES (
id INTEGER PRIMARY KEY,
text varchar(32) NOT NULL,
name varchar(32) NOT NULL,
color varchar(7) NOT NULL,
enabled BOOL DEFAULT(true)
enabled BOOL DEFAULT 1
);
CREATE TABLE IF NOT EXISTS USERS (
name varchar(64) PRIMARY KEY,
password binary(60) NOT NULL,
password BLOB NOT NULL,
admin BOOL NOT NULL DEFAULT(false),
tokenID varchar(64) NOT NULL,
CHECK (length(password) = 60),