diff --git a/backend/pkg/db/users/users.go b/backend/pkg/db/users/users.go index 32a55b1..7ce0baf 100644 --- a/backend/pkg/db/users/users.go +++ b/backend/pkg/db/users/users.go @@ -11,6 +11,11 @@ type User struct { Admin bool `db:"admin" json:"admin"` } +type UserChangePassword struct { + UserName string `json:"userName" validate:"required" db:"userName"` + Password string `json:"password" validate:"required,min=12"` +} + // hashes a password func hashPassword(password string) ([]byte, error) { return bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) @@ -64,11 +69,6 @@ func Add(user UserAdd) error { } } -type UserChangePassword struct { - UserName string `json:"userName" validate:"required" db:"userName"` - Password string `json:"password" validate:"required,min=12"` -} - func ChangePassword(user UserChangePassword) (string, error) { // try to hash teh password if hash, err := hashPassword(user.Password); err != nil { @@ -103,3 +103,9 @@ func SetAdmin(userName string, admin bool) error { return err } + +func Delete(userName string) error { + _, err := db.DB.Exec("DELETE FROM USERS WHERE name = $1", userName) + + return err +} diff --git a/backend/pkg/router/router.go b/backend/pkg/router/router.go index 0d733d7..ffd8de2 100644 --- a/backend/pkg/router/router.go +++ b/backend/pkg/router/router.go @@ -102,6 +102,7 @@ func init() { "event": deleteEvent, "tasks": deleteTask, "availabilities": deleteAvailability, + "users": deleteUser, }, } diff --git a/backend/pkg/router/user.go b/backend/pkg/router/user.go index bfe2833..7c620b6 100644 --- a/backend/pkg/router/user.go +++ b/backend/pkg/router/user.go @@ -189,3 +189,48 @@ func patchUser(args HandlerArgs) responseMessage { return response } + +func deleteUser(args HandlerArgs) responseMessage { + // check admin + if !args.User.Admin { + logger.Warn().Msg("user-deletion failed: user is no admin") + + return responseMessage{ + Status: fiber.StatusUnauthorized, + } + + // get the username from the query + } else if userName := args.C.Query("userName"); userName == "" { + logger.Log().Msg("user-deletion failed: query is missing \"userName\"") + + return responseMessage{ + Status: fiber.StatusBadRequest, + } + + // check wether the user tries to delete himself + } else if userName == args.User.UserName { + logger.Log().Msg("user-deletion failed: self-deletion is illegal") + + return responseMessage{ + Status: fiber.StatusBadRequest, + } + + // check wether the user tries to delete the admin + } else if userName == "admin" { + logger.Log().Msg("user-deletion failed: admin-deletion is illegal") + + return responseMessage{ + Status: fiber.StatusBadRequest, + } + + // delete the user + } else if err := users.Delete(userName); err != nil { + logger.Error().Msgf("user-deletion failed: user doesn't exist") + + return responseMessage{ + Status: fiber.StatusNotFound, + } + } else { + return responseMessage{} + } +} diff --git a/client/src/Zustand.ts b/client/src/Zustand.ts index b6aab91..8fdc01f 100644 --- a/client/src/Zustand.ts +++ b/client/src/Zustand.ts @@ -23,6 +23,10 @@ export interface User { admin: boolean; } +export type UserAddModify = User & { + password: string; +}; + interface Zustand { user: User | null; tasks?: Task[]; diff --git a/client/src/app/account/page.tsx b/client/src/app/account/page.tsx index 63c6d9e..2e9397b 100644 --- a/client/src/app/account/page.tsx +++ b/client/src/app/account/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { apiCall, vaidatePassword as validatePassword } from "@/lib"; +import { apiCall, validatePassword as validatePassword } from "@/lib"; import { Button, Card, diff --git a/client/src/app/admin/(availabilities)/Availabilities.tsx b/client/src/app/admin/(availabilities)/Availabilities.tsx index 8658a37..f73aea5 100644 --- a/client/src/app/admin/(availabilities)/Availabilities.tsx +++ b/client/src/app/admin/(availabilities)/Availabilities.tsx @@ -91,7 +91,7 @@ export default function Availabilities() { } const topContent = ( - <> +