fixed assignments view once again
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user