diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index 6a9c683..71da7bf 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -13,6 +13,8 @@ class AdminController { this.searchUser = this.searchUser.bind(this); this.getFalukantUserById = this.getFalukantUserById.bind(this); this.changeFalukantUser = this.changeFalukantUser.bind(this); + this.getFalukantUserBranches = this.getFalukantUserBranches.bind(this); + this.updateFalukantStock = this.updateFalukantStock.bind(this); this.getRoomTypes = this.getRoomTypes.bind(this); this.getGenderRestrictions = this.getGenderRestrictions.bind(this); this.getUserRights = this.getUserRights.bind(this); @@ -137,6 +139,31 @@ class AdminController { } } + async getFalukantUserBranches(req, res) { + try { + const { userid: userId } = req.headers; + const { falukantUserId } = req.params; + const response = await AdminService.getFalukantUserBranches(userId, falukantUserId); + res.status(200).json(response); + } catch (error) { + console.log(error); + res.status(403).json({ error: error.message }); + } + } + + async updateFalukantStock(req, res) { + try { + const { userid: userId } = req.headers; + const { stockId } = req.params; + const { quantity } = req.body; + const response = await AdminService.updateFalukantStock(userId, stockId, quantity); + res.status(200).json(response); + } catch (error) { + console.log(error); + res.status(403).json({ error: error.message }); + } + } + async getRoomTypes(req, res) { try { const userId = req.headers.userid; diff --git a/backend/routers/adminRouter.js b/backend/routers/adminRouter.js index 873ef27..302d24e 100644 --- a/backend/routers/adminRouter.js +++ b/backend/routers/adminRouter.js @@ -24,6 +24,8 @@ router.post('/contacts/answer', authenticate, adminController.answerContact); router.post('/falukant/searchuser', authenticate, adminController.searchUser); router.get('/falukant/getuser/:id', authenticate, adminController.getFalukantUserById); router.post('/falukant/edituser', authenticate, adminController.changeFalukantUser); +router.get('/falukant/branches/:falukantUserId', authenticate, adminController.getFalukantUserBranches); +router.put('/falukant/stock/:stockId', authenticate, adminController.updateFalukantStock); // --- Minigames Admin --- router.get('/minigames/match3/campaigns', authenticate, adminController.getMatch3Campaigns); diff --git a/backend/services/adminService.js b/backend/services/adminService.js index 6dec17f..b040495 100644 --- a/backend/services/adminService.js +++ b/backend/services/adminService.js @@ -15,6 +15,11 @@ import FalukantUser from "../models/falukant/data/user.js"; import FalukantCharacter from "../models/falukant/data/character.js"; import FalukantPredefineFirstname from "../models/falukant/predefine/firstname.js"; import FalukantPredefineLastname from "../models/falukant/predefine/lastname.js"; +import Branch from "../models/falukant/data/branch.js"; +import FalukantStock from "../models/falukant/data/stock.js"; +import FalukantStockType from "../models/falukant/type/stock.js"; +import RegionData from "../models/falukant/data/region.js"; +import BranchType from "../models/falukant/type/branch.js"; import Room from '../models/chat/room.js'; class AdminService { @@ -251,6 +256,63 @@ class AdminService { return user; } + async getFalukantUserBranches(userId, falukantUserId) { + if (!(await this.hasUserAccess(userId, 'falukantusers'))) { + throw new Error('noaccess'); + } + + try { + // Zuerst die Branches laden + const branches = await Branch.findAll({ + where: { + falukantUserId: falukantUserId + } + }); + + // Dann für jede Branch die zusätzlichen Daten laden + const branchesWithData = await Promise.all(branches.map(async (branch) => { + const region = await RegionData.findByPk(branch.regionId); + const branchType = await BranchType.findByPk(branch.branchTypeId); + const stocks = await FalukantStock.findAll({ + where: { branchId: branch.id }, + include: [{ + model: FalukantStockType, + as: 'stockType', + attributes: ['labelTr'] + }] + }); + + return { + ...branch.toJSON(), + region: region ? { name: region.name } : null, + branchType: branchType ? { labelTr: branchType.labelTr } : null, + stocks: stocks + }; + })); + + return branchesWithData; + } catch (error) { + console.error('Error in getFalukantUserBranches:', error); + throw error; + } + } + + async updateFalukantStock(userId, stockId, quantity) { + if (!(await this.hasUserAccess(userId, 'falukantusers'))) { + throw new Error('noaccess'); + } + + const stock = await FalukantStock.findByPk(stockId); + if (!stock) { + throw new Error('Stock not found'); + } + + stock.quantity = quantity; + await stock.save(); + + return stock; + } + async changeFalukantUser(userId, falukantUserId, falukantData) { if (!(await this.hasUserAccess(userId, 'falukantusers'))) { throw new Error('noaccess'); diff --git a/frontend/src/i18n/locales/de/admin.json b/frontend/src/i18n/locales/de/admin.json index 193b79a..bd50a6b 100644 --- a/frontend/src/i18n/locales/de/admin.json +++ b/frontend/src/i18n/locales/de/admin.json @@ -45,8 +45,25 @@ }, "falukant": { "edituser": { + "title": "Falukant Benutzer bearbeiten", + "username": "Benutzername", + "characterName": "Charaktername", + "user": "Benutzer", "success": "Die Änderungen wurden gespeichert.", - "error": "Die Änderungen konnten nicht gespeichert werden." + "error": "Die Änderungen konnten nicht gespeichert werden.", + "errorLoadingBranches": "Fehler beim Laden der Niederlassungen.", + "errorUpdatingStock": "Fehler beim Aktualisieren des Lagers.", + "stockUpdated": "Lager erfolgreich aktualisiert.", + "search": "Suchen", + "tabs": { + "userdata": "Benutzerdaten", + "branches": "Niederlassungen" + }, + "branches": { + "title": "Niederlassungen & Lager", + "noStocks": "Kein Lager vorhanden", + "noBranches": "Keine Niederlassungen gefunden" + } } }, "chatrooms": { diff --git a/frontend/src/i18n/locales/de/general.json b/frontend/src/i18n/locales/de/general.json index 7cbfaf7..0271f4d 100644 --- a/frontend/src/i18n/locales/de/general.json +++ b/frontend/src/i18n/locales/de/general.json @@ -46,6 +46,8 @@ "edit": "Bearbeiten", "delete": "Löschen", "create": "Erstellen", + "update": "Aktualisieren", + "save": "Speichern", "yes": "Ja", "no": "Nein" } diff --git a/frontend/src/i18n/locales/en/admin.json b/frontend/src/i18n/locales/en/admin.json index df34079..5ac56e9 100644 --- a/frontend/src/i18n/locales/en/admin.json +++ b/frontend/src/i18n/locales/en/admin.json @@ -54,6 +54,29 @@ "objectiveDescriptionPlaceholder": "e.g. Collect 100 points", "objectiveRequired": "Required for level completion", "noObjectives": "No victory conditions defined. Click 'Add Objective' to create some." + }, + "falukant": { + "edituser": { + "title": "Edit Falukant User", + "username": "Username", + "characterName": "Character Name", + "user": "User", + "success": "Changes have been saved.", + "error": "Changes could not be saved.", + "errorLoadingBranches": "Error loading branches.", + "errorUpdatingStock": "Error updating warehouse.", + "stockUpdated": "Warehouse successfully updated.", + "search": "Search", + "tabs": { + "userdata": "User Data", + "branches": "Branches" + }, + "branches": { + "title": "Branches & Warehouse", + "noStocks": "No warehouse available", + "noBranches": "No branches found" + } + } } } } \ No newline at end of file diff --git a/frontend/src/i18n/locales/en/general.json b/frontend/src/i18n/locales/en/general.json index ede81ff..a357264 100644 --- a/frontend/src/i18n/locales/en/general.json +++ b/frontend/src/i18n/locales/en/general.json @@ -8,5 +8,14 @@ }, "message": { "close": "Close" + }, + "common": { + "edit": "Edit", + "delete": "Delete", + "create": "Create", + "update": "Update", + "save": "Save", + "yes": "Yes", + "no": "No" } } \ No newline at end of file diff --git a/frontend/src/views/admin/falukant/EditUserView.vue b/frontend/src/views/admin/falukant/EditUserView.vue index 2210a88..2747572 100644 --- a/frontend/src/views/admin/falukant/EditUserView.vue +++ b/frontend/src/views/admin/falukant/EditUserView.vue @@ -1,32 +1,80 @@ @@ -34,10 +82,14 @@ \ No newline at end of file