From 846f137b7ab5987103f43d5ed3dfd26241d8d46d Mon Sep 17 00:00:00 2001 From: Settel Date: Sat, 3 Jun 2023 22:39:36 +0200 Subject: [PATCH] feat: setup app, create admin user (WIP) --- client/src/composables/engine/setupApp.ts | 8 +++++ client/src/composables/useEngine.ts | 3 ++ client/src/pages/setup.vue | 3 +- server/.gitignore | 2 +- server/src/application/createUser.go | 12 ++++++-- server/src/application/setupApp.go | 37 +++++++++++++++++++++++ server/src/knowyt.go | 1 + 7 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 client/src/composables/engine/setupApp.ts create mode 100644 server/src/application/setupApp.go diff --git a/client/src/composables/engine/setupApp.ts b/client/src/composables/engine/setupApp.ts new file mode 100644 index 0000000..bb7b730 --- /dev/null +++ b/client/src/composables/engine/setupApp.ts @@ -0,0 +1,8 @@ +import { useUserinfoStore } from "@/stores/UserinfoStore" +import { EngineContext } from '@/composables/useEngine' + +export async function setupApp(this: EngineContext, authcode: string): Promise { + await this.callApi('/api/setupApp', { + authcode, + }) +} \ No newline at end of file diff --git a/client/src/composables/useEngine.ts b/client/src/composables/useEngine.ts index bf281a6..f034fe2 100644 --- a/client/src/composables/useEngine.ts +++ b/client/src/composables/useEngine.ts @@ -1,6 +1,7 @@ import { Ref, ref } from 'vue' import { callApi, QueryParams } from '@/composables/engine/callApi' import { start, stop } from '@/composables/engine/startStop' +import { setupApp } from '@/composables/engine/setupApp' import { fetchUpdate } from '@/composables/engine/fetchUpdate' import { loadQuotes, getQuotesRef, deleteQuote, saveQuote } from '@/composables/engine/quotes' import { fetchGameInfo, fetchGameInfos, setGameLang, setGameName, savePlayer, removePlayer, createGame, cameo, logoutCameo } from '@/composables/engine/gameManagement' @@ -48,6 +49,7 @@ export interface useEngine { createGame: (name: string, teamname: string, lang: Lang) => Promise cameo: (authcode: string) => Promise logoutCameo: () => Promise + setupApp: (authcode: string) => Promise } export default (): useEngine => { @@ -92,5 +94,6 @@ export default (): useEngine => { createGame: (name: string, teamname: string, lang: Lang) => createGame.apply(context, [name, teamname, lang]), cameo: (authcode: string) => cameo.apply(context,[authcode]), logoutCameo: () => logoutCameo.apply(context), + setupApp: (authcode) => setupApp.apply(context, [authcode]), } } diff --git a/client/src/pages/setup.vue b/client/src/pages/setup.vue index 3937e0c..a8ab567 100644 --- a/client/src/pages/setup.vue +++ b/client/src/pages/setup.vue @@ -29,6 +29,7 @@ import { ref } from 'vue' import useAuth from '@/composables/useAuth' import useI18n from '@/composables/useI18n' +import useEngine from '@/composables/useEngine' const { $t } = useI18n({ 'create admin user': { en: 'create admin user', de: 'Admin-Benutzer anlegen' }, @@ -52,7 +53,7 @@ const openModal = () => { } const createAdminAccount = () => { - + useEngine().setupApp(authcode.value) } diff --git a/server/.gitignore b/server/.gitignore index dde040d..6a3933c 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,2 +1,2 @@ knowyt -data/games/*/state.json +data/ diff --git a/server/src/application/createUser.go b/server/src/application/createUser.go index c6e82ec..0bce4e9 100644 --- a/server/src/application/createUser.go +++ b/server/src/application/createUser.go @@ -2,23 +2,29 @@ package application import ( "fmt" - "github.com/google/uuid" "path" + + "github.com/google/uuid" "sirlab.de/go/knowyt/game" "sirlab.de/go/knowyt/user" ) func (app *Application) createUser(gm *game.Game, name, role, authcode string) (string, error) { + gameId := "" + if gm != nil { + gameId = gm.GetId() + } + if authcode != "" { if _, err := app.GetUserByAuthcode(authcode); err == nil { - return "", fmt.Errorf("%s authcode already in use", gm.GetId()) + return "", fmt.Errorf("%s authcode already in use", gameId) } } dirName := path.Join(app.config.DataDir, "users") userNewUuid := uuid.NewString() fileName := path.Join(dirName, userNewUuid+".json") - newUser := user.CreateUser(fileName, gm.GetId()) + newUser := user.CreateUser(fileName, gameId) newUser.SetRole(role) newUser.SetName(name) newUser.SetAuthcode(authcode) diff --git a/server/src/application/setupApp.go b/server/src/application/setupApp.go new file mode 100644 index 0000000..8ba9114 --- /dev/null +++ b/server/src/application/setupApp.go @@ -0,0 +1,37 @@ +package application + +import ( + "fmt" + "net/http" + "regexp" + + "sirlab.de/go/knowyt/log" + "sirlab.de/go/knowyt/user" +) + +func (app *Application) SetupApp(w http.ResponseWriter, r *http.Request) { + authcode := r.URL.Query().Get("authcode") + if match, err := regexp.MatchString("^\\d{6}$", authcode); err != nil || !match { + w.WriteHeader(http.StatusInternalServerError) + log.Error("setupApp failed: invalid authcode does not consist of exactly 6 digits") + fmt.Fprintf(w, "server error") + return + } + + _, err := app.createUser(nil, "Admin", user.ROLE_ADMIN, authcode) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.ErrorLog(err) + fmt.Fprintf(w, "server error") + return + } + + // if err != nil { + // w.WriteHeader(http.StatusNotFound) + // fmt.Fprintf(w, "...") + // return + // } + + log.Debug("setup app successful\n") + fmt.Fprintf(w, "ok") +} diff --git a/server/src/knowyt.go b/server/src/knowyt.go index b553c5b..4b5c89c 100644 --- a/server/src/knowyt.go +++ b/server/src/knowyt.go @@ -21,6 +21,7 @@ func main() { mux.PublicHandleFunc("/__intern__/exit", handler.Exit) mux.PublicHandleFunc("/api/login", mux.Login) mux.PublicHandleFunc("/api/logout", mux.Logout) + mux.PublicHandleFunc("/api/setupApp", app.SetupApp) mux.PublicHandleFunc("/api/createGame", app.CreateGame) mux.PrivateOrPublicHandleFunc("/api/userinfo", mux.GetUserInfo, mux.CheckSetup) mux.PrivateHandleFunc("/api/cameo", mux.Cameo)