From 6acfbe160229b9a0a8e780e2dd15acea019b57c2 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 26 Oct 2025 17:19:46 +0100 Subject: [PATCH] Introduced app management functionality: - Added Vue components (`AppListItem`, `AddApp`, `Apps`) for app management. - Implemented Vuex stores for apps and groups. - Enhanced backend: - CRUD operations for apps and group mappings. - Introduced a new service for app-related logic. - Updated database schema and DTO structure. - Adjusted security and CORS configurations. - Updated docker-compose to align service dependencies. --- docker-compose.yml | 42 ++-- src/frontend/src/components/UI/AddApp.vue | 226 ++++++++++++++++++ .../src/components/UI/AppListItem.vue | 83 +++++++ .../src/components/layout/config/Apps.vue | 86 +++++++ src/frontend/src/pages/Config.vue | 10 + src/frontend/src/store/activeuser.js | 7 +- src/frontend/src/store/apps.js | 72 ++++++ src/frontend/src/store/group.js | 25 ++ .../java/de/avatic/lcc/config/CorsConfig.java | 7 +- .../de/avatic/lcc/config/LccOidcUser.java | 4 +- .../de/avatic/lcc/config/SecurityConfig.java | 14 +- .../lcc/config/SelfIssuedJwtFilter.java | 2 +- .../configuration}/AppsController.java | 19 +- .../lcc/controller/token/TokenController.java | 2 +- .../lcc/controller/users/GroupController.java | 2 +- .../{users => configuration/apps}/AppDTO.java | 2 +- .../lcc/repositories/users/AppRepository.java | 19 +- .../repositories/users/UserRepository.java | 6 +- .../avatic/lcc/service/apps/AppsService.java | 31 ++- .../apps}/JwtTokenService.java | 4 +- .../transformer/apps/AppTransformer.java | 2 +- src/main/resources/schema.sql | 4 +- 22 files changed, 604 insertions(+), 65 deletions(-) create mode 100644 src/frontend/src/components/UI/AddApp.vue create mode 100644 src/frontend/src/components/UI/AppListItem.vue create mode 100644 src/frontend/src/components/layout/config/Apps.vue create mode 100644 src/frontend/src/store/apps.js create mode 100644 src/frontend/src/store/group.js rename src/main/java/de/avatic/lcc/{dto/configuration/apps => controller/configuration}/AppsController.java (56%) rename src/main/java/de/avatic/lcc/dto/{users => configuration/apps}/AppDTO.java (96%) rename src/main/java/de/avatic/lcc/{repositories/users => service/apps}/JwtTokenService.java (96%) diff --git a/docker-compose.yml b/docker-compose.yml index 2267be1..c9dfb52 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,54 +1,50 @@ services: mysql: image: mysql:8.0 - container_name: lcc-mysql + container_name: lcc-mysql-local environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} - MYSQL_DATABASE: ${DB_DATABASE} - MYSQL_USER: ${DB_USER} - MYSQL_PASSWORD: ${DB_PASSWORD} + MYSQL_DATABASE: lcc + MYSQL_USER: ${SPRING_DATASOURCE_USERNAME} + MYSQL_PASSWORD: ${SPRING_DATASOURCE_PASSWORD} volumes: - - mysql-data:/var/lib/mysql + - mysql-data-local:/var/lib/mysql ports: - "3306:3306" networks: - - lcc-network + - lcc-network-local healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 + restart: unless-stopped lcc-app: #image: git.avatic.de/avatic/lcc:latest + # Oder für lokales Bauen: build: . - container_name: lcc-app + container_name: lcc-app-local depends_on: mysql: condition: service_healthy + env_file: + - .env environment: - DB_DATABASE: ${DB_DATABASE} - DB_USER: ${DB_USER} - DB_PASSWORD: ${DB_PASSWORD} - ALLOWED_CORS_DOMAIN: ${ALLOWED_CORS_DOMAIN} - LCC_BASE_URL: ${LCC_BASE_URL} - AZURE_MAPS_CLIENT_ID: ${AZURE_MAPS_CLIENT_ID} - AZURE_MAPS_SUBSCRIPTION_KEY: ${AZURE_MAPS_SUBSCRIPTION_KEY} - AZURE_TENANT_ID: ${AZURE_TENANT_ID} - AZURE_CLIENT_ID: ${AZURE_CLIENT_ID} - AZURE_CLIENT_SECRET: ${AZURE_CLIENT_SECRET} - JWT_SECRET: ${JWT_SECRET} - SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${DB_DATABASE} - SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} + # Überschreibe die Datasource URL für Docker-Netzwerk + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/lcc ports: - "8080:8080" networks: - - lcc-network + - lcc-network-local + dns: + - 8.8.8.8 + - 8.8.4.4 restart: unless-stopped volumes: - mysql-data: + mysql-data-local: networks: - lcc-network: + lcc-network-local: driver: bridge \ No newline at end of file diff --git a/src/frontend/src/components/UI/AddApp.vue b/src/frontend/src/components/UI/AddApp.vue new file mode 100644 index 0000000..6524a2a --- /dev/null +++ b/src/frontend/src/components/UI/AddApp.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/UI/AppListItem.vue b/src/frontend/src/components/UI/AppListItem.vue new file mode 100644 index 0000000..a48c8f7 --- /dev/null +++ b/src/frontend/src/components/UI/AppListItem.vue @@ -0,0 +1,83 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/layout/config/Apps.vue b/src/frontend/src/components/layout/config/Apps.vue new file mode 100644 index 0000000..1949b4c --- /dev/null +++ b/src/frontend/src/components/layout/config/Apps.vue @@ -0,0 +1,86 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/pages/Config.vue b/src/frontend/src/pages/Config.vue index 8c58801..0062814 100644 --- a/src/frontend/src/pages/Config.vue +++ b/src/frontend/src/pages/Config.vue @@ -27,6 +27,7 @@ import Materials from "@/components/layout/config/Materials.vue"; import ErrorLog from "@/pages/ErrorLog.vue"; import {mapStores} from "pinia"; import {useActiveUserStore} from "@/store/activeuser.js"; +import Apps from "@/components/layout/config/Apps.vue"; export default { name: "Config", @@ -39,6 +40,11 @@ export default { component: markRaw(Properties), props: {isSelected: false}, }, + appsTab: { + title: 'Apps', + component: markRaw(Apps), + props: {isSelected: false}, + }, systemLogTab: { title: 'System log', component: markRaw(ErrorLog), @@ -76,6 +82,10 @@ export default { tabs.push(this.systemLogTab); } + if(this.activeUserStore.isService) { + tabs.push(this.appsTab); + } + tabs.push(this.materialsTab); tabs.push(this.nodesTab); diff --git a/src/frontend/src/store/activeuser.js b/src/frontend/src/store/activeuser.js index 4b207ce..4545498 100644 --- a/src/frontend/src/store/activeuser.js +++ b/src/frontend/src/store/activeuser.js @@ -18,7 +18,7 @@ export const useActiveUserStore = defineStore('activeUser', { allowConfiguration(state) { if (state.user === null) return false; - return state.user.groups?.includes("super") || state.user.groups?.includes("freight") || state.user.groups?.includes("packaging"); + return state.user.groups?.includes("super") || state.user.groups?.includes("freight") || state.user.groups?.includes("packaging") || state.user.groups?.includes("service"); }, allowReporting(state) { if (state.user === null) @@ -30,6 +30,11 @@ export const useActiveUserStore = defineStore('activeUser', { return false; return state.user.groups?.includes("super"); }, + isService(state) { + if (state.user === null) + return false; + return state.user.groups?.includes("service"); + }, isPackaging(state) { if (state.user === null) return false; diff --git a/src/frontend/src/store/apps.js b/src/frontend/src/store/apps.js new file mode 100644 index 0000000..756689e --- /dev/null +++ b/src/frontend/src/store/apps.js @@ -0,0 +1,72 @@ +import {defineStore} from 'pinia' +import {config} from '@/config' +import {useErrorStore} from "@/store/error.js"; +import performRequest from "@/backend.js"; +import logger from "@/logger.js"; + + +export const useAppsStore = defineStore('apps', { + state: () => ({ + apps: [], + loading: false, + + }), + getters: { + getById: (state) => { + return (id) => state.apps.find(p => p.id === id) + } + }, + actions: { + async loadApps() { + this.loading = true; + const url = `${config.backendUrl}/apps`; + const resp = await performRequest(this, 'GET', url, null); + this.apps = resp.data; + this.loading = false; + }, + async addApp(appName, appGroups) { + const url = `${config.backendUrl}/apps`; + + const app = { + name: appName, + groups: [], + } + + for (const [key, value] of Object.entries(appGroups)) { + if (value) { + app.groups.push(key); + } + } + + + const resp = await performRequest(this, 'POST', url, app); + this.apps.push(resp.data); + return resp.data; + }, + async updateApp(appId, appName, appGroups) { + const url = `${config.backendUrl}/apps/${appId}`; + + const app = { + id: appId, + name: appName, + groups: [], + }; + + for (const [key, value] of Object.entries(appGroups)) { + if (value) { + app.groups.push(key); + } + } + + const resp = await performRequest(this, 'POST', url, app); + const index = this.apps.findIndex(a => a.id === app.id); + this.apps[index] = resp.data; + }, + async deleteApp(appId) { + const url = `${config.backendUrl}/apps/${appId}`; + await performRequest(this, 'DELETE', url, null, false); + this.apps = this.apps.filter(a => a.id !== appId); + } + + } +}); \ No newline at end of file diff --git a/src/frontend/src/store/group.js b/src/frontend/src/store/group.js new file mode 100644 index 0000000..c3c2e35 --- /dev/null +++ b/src/frontend/src/store/group.js @@ -0,0 +1,25 @@ +import {defineStore} from 'pinia' +import {config} from '@/config' +import performRequest from "@/backend.js"; + + +export const useGroupStore = defineStore('group', { + state: () => ({ + groups: [], + loading: false, + }), + getters: { + getById: (state) => { + return (id) => state.group.find(p => p.id === id) + } + }, + actions: { + async loadGroups() { + this.loading = true; + const url = `${config.backendUrl}/groups`; + const resp = await performRequest(this,'GET', url, null); + this.groups = resp.data; + this.loading = false; + } + } +}); \ No newline at end of file diff --git a/src/main/java/de/avatic/lcc/config/CorsConfig.java b/src/main/java/de/avatic/lcc/config/CorsConfig.java index 284f0b7..cae303c 100644 --- a/src/main/java/de/avatic/lcc/config/CorsConfig.java +++ b/src/main/java/de/avatic/lcc/config/CorsConfig.java @@ -20,12 +20,15 @@ import java.util.Arrays; @Profile("dev | test") public class CorsConfig implements WebMvcConfigurer { - @Autowired - private Environment environment; + private final Environment environment; @Value("${lcc.allowed_cors}") private String allowedCors; + public CorsConfig(Environment environment) { + this.environment = environment; + } + @Override public void addCorsMappings(@NotNull CorsRegistry registry) { String[] activeProfiles = environment.getActiveProfiles(); diff --git a/src/main/java/de/avatic/lcc/config/LccOidcUser.java b/src/main/java/de/avatic/lcc/config/LccOidcUser.java index d5918e9..c27de44 100644 --- a/src/main/java/de/avatic/lcc/config/LccOidcUser.java +++ b/src/main/java/de/avatic/lcc/config/LccOidcUser.java @@ -23,11 +23,11 @@ public class LccOidcUser extends DefaultOidcUser { this.userId = userId; } - public static User createDatabaseUser(String email, String firstName, String lastName, String workdayId) { + public static User createDatabaseUser(String email, String firstName, String lastName, String workdayId, boolean isFirstUser) { User user = new User(); Group group = new Group(); - group.setName("none"); + group.setName(isFirstUser ? "service" : "none"); user.setEmail(email); user.setFirstName(firstName == null ? "" : firstName); diff --git a/src/main/java/de/avatic/lcc/config/SecurityConfig.java b/src/main/java/de/avatic/lcc/config/SecurityConfig.java index 3ab8746..ac04ee1 100644 --- a/src/main/java/de/avatic/lcc/config/SecurityConfig.java +++ b/src/main/java/de/avatic/lcc/config/SecurityConfig.java @@ -2,7 +2,7 @@ package de.avatic.lcc.config; import de.avatic.lcc.model.db.users.User; import de.avatic.lcc.repositories.users.GroupRepository; -import de.avatic.lcc.repositories.users.JwtTokenService; +import de.avatic.lcc.service.apps.JwtTokenService; import de.avatic.lcc.repositories.users.UserRepository; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -48,9 +48,6 @@ import java.util.function.Supplier; @EnableMethodSecurity public class SecurityConfig { - @Value("${lcc.base.url}") - private String baseUrl; - @Bean @Profile("!dev & !test") // Only active when NOT in dev profile public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtTokenService jwtTokenService) throws Exception { @@ -63,10 +60,6 @@ public class SecurityConfig { ) .oauth2Login(oauth2 -> oauth2 .defaultSuccessUrl("/", true) - // Redirect-URI explizit setzen: -// .redirectionEndpoint(redirection -> redirection -// .baseUri(baseUrl + "/login/oauth2/code/*") -// ) ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt @@ -178,8 +171,9 @@ public class SecurityConfig { } if (user == null) { - userRepository.update(LccOidcUser.createDatabaseUser(email, oidcUser.getGivenName(), oidcUser.getFamilyName(), workdayId)); - mappedAuthorities.add(new SimpleGrantedAuthority("ROLE_NONE")); + var isFirstUser = userRepository.count() == 0; + userRepository.update(LccOidcUser.createDatabaseUser(email, oidcUser.getGivenName(), oidcUser.getFamilyName(), workdayId, isFirstUser)); + mappedAuthorities.add(new SimpleGrantedAuthority(isFirstUser ? "ROLE_SERVICE" : "ROLE_NONE")); } diff --git a/src/main/java/de/avatic/lcc/config/SelfIssuedJwtFilter.java b/src/main/java/de/avatic/lcc/config/SelfIssuedJwtFilter.java index 79e8385..817c6d8 100644 --- a/src/main/java/de/avatic/lcc/config/SelfIssuedJwtFilter.java +++ b/src/main/java/de/avatic/lcc/config/SelfIssuedJwtFilter.java @@ -1,5 +1,5 @@ package de.avatic.lcc.config; -import de.avatic.lcc.repositories.users.JwtTokenService; +import de.avatic.lcc.service.apps.JwtTokenService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; diff --git a/src/main/java/de/avatic/lcc/dto/configuration/apps/AppsController.java b/src/main/java/de/avatic/lcc/controller/configuration/AppsController.java similarity index 56% rename from src/main/java/de/avatic/lcc/dto/configuration/apps/AppsController.java rename to src/main/java/de/avatic/lcc/controller/configuration/AppsController.java index 73a3f13..3880a60 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/apps/AppsController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/AppsController.java @@ -1,13 +1,10 @@ -package de.avatic.lcc.dto.configuration.apps; +package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.users.AppDTO; -import de.avatic.lcc.repositories.users.AppRepository; +import com.azure.core.annotation.BodyParam; +import de.avatic.lcc.dto.configuration.apps.AppDTO; import de.avatic.lcc.service.apps.AppsService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -29,9 +26,15 @@ public class AppsController { } @PostMapping({"", "/"}) - public ResponseEntity updateApp(AppDTO dto) { + public ResponseEntity updateApp(@RequestBody AppDTO dto) { return ResponseEntity.ok(appsService.updateApp(dto)); } + @DeleteMapping({"/{id}", "/{id}/"}) + public ResponseEntity deleteApp(@PathVariable Integer id) { + appsService.deleteApp(id); + return ResponseEntity.ok().build(); + } + } diff --git a/src/main/java/de/avatic/lcc/controller/token/TokenController.java b/src/main/java/de/avatic/lcc/controller/token/TokenController.java index f60a022..3d00995 100644 --- a/src/main/java/de/avatic/lcc/controller/token/TokenController.java +++ b/src/main/java/de/avatic/lcc/controller/token/TokenController.java @@ -1,7 +1,7 @@ package de.avatic.lcc.controller.token; import de.avatic.lcc.model.db.users.App; -import de.avatic.lcc.repositories.users.JwtTokenService; +import de.avatic.lcc.service.apps.JwtTokenService; import de.avatic.lcc.service.apps.AppsService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/de/avatic/lcc/controller/users/GroupController.java b/src/main/java/de/avatic/lcc/controller/users/GroupController.java index c36e741..02ccf09 100644 --- a/src/main/java/de/avatic/lcc/controller/users/GroupController.java +++ b/src/main/java/de/avatic/lcc/controller/users/GroupController.java @@ -33,7 +33,7 @@ public class GroupController { * @return A ResponseEntity containing the list of groups and pagination headers. */ @GetMapping({"/", ""}) - @PreAuthorize("hasRole('RIGHT-MANAGMENT')") + @PreAuthorize("hasAnyRole('RIGHT-MANAGMENT', 'SERVICE')") public ResponseEntity> listGroups(@RequestParam(defaultValue = "20") @Min(1) int limit, @RequestParam(defaultValue = "1") @Min(1) int page) { diff --git a/src/main/java/de/avatic/lcc/dto/users/AppDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/apps/AppDTO.java similarity index 96% rename from src/main/java/de/avatic/lcc/dto/users/AppDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/apps/AppDTO.java index 0bb87ca..9be3b51 100644 --- a/src/main/java/de/avatic/lcc/dto/users/AppDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/apps/AppDTO.java @@ -1,4 +1,4 @@ -package de.avatic.lcc.dto.users; +package de.avatic.lcc.dto.configuration.apps; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/de/avatic/lcc/repositories/users/AppRepository.java b/src/main/java/de/avatic/lcc/repositories/users/AppRepository.java index ec44dbe..072b4a7 100644 --- a/src/main/java/de/avatic/lcc/repositories/users/AppRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/users/AppRepository.java @@ -86,11 +86,14 @@ public class AppRepository { List groupIds = groupRepository.findGroupIds(app.getGroups().stream().map(Group::getName).toList()); if (appId == null) { + String sql = """ + INSERT INTO sys_app (name, client_id, client_secret) + VALUES (?, ?, ?)"""; + KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement( - "INSERT INTO sys_app (name, client_id, client_secret) " + - "VALUES (?, ?, ?)", + sql, Statement.RETURN_GENERATED_KEYS ); ps.setString(1, app.getName()); @@ -104,7 +107,7 @@ public class AppRepository { String query = """ UPDATE sys_app SET name = ? WHERE id = ?"""; - jdbcTemplate.update(query, app.getName()); + jdbcTemplate.update(query, app.getName(), appId); } updateAppGroupMappings(appId, groupIds); @@ -150,13 +153,19 @@ public class AppRepository { /** * Deletes an app by id. + * Also removes all associated group mappings. * * @param id id of the app to delete */ @Transactional public void delete(Integer id) { - String sql = "DELETE FROM sys_app WHERE id = ?"; - jdbcTemplate.update(sql, id); + // First delete all group mappings for this app + String deleteMappingsSql = "DELETE FROM sys_app_group_mapping WHERE app_id = ?"; + jdbcTemplate.update(deleteMappingsSql, id); + + // Then delete the app itself + String deleteAppSql = "DELETE FROM sys_app WHERE id = ?"; + jdbcTemplate.update(deleteAppSql, id); } /** diff --git a/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java b/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java index 2110430..ed830f7 100644 --- a/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java @@ -96,8 +96,10 @@ public class UserRepository { } - - + @Transactional + public Integer count() { + return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM sys_user", Integer.class); + } private void updateUserGroupMappings(Integer userId, List groups) { diff --git a/src/main/java/de/avatic/lcc/service/apps/AppsService.java b/src/main/java/de/avatic/lcc/service/apps/AppsService.java index d15e4c9..09f9641 100644 --- a/src/main/java/de/avatic/lcc/service/apps/AppsService.java +++ b/src/main/java/de/avatic/lcc/service/apps/AppsService.java @@ -1,14 +1,17 @@ package de.avatic.lcc.service.apps; -import de.avatic.lcc.dto.users.AppDTO; +import de.avatic.lcc.dto.configuration.apps.AppDTO; import de.avatic.lcc.model.db.users.App; import de.avatic.lcc.repositories.users.AppRepository; import de.avatic.lcc.service.transformer.apps.AppTransformer; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.security.SecureRandom; +import java.util.Base64; import java.util.List; import java.util.Optional; +import java.util.UUID; @Service public class AppsService { @@ -30,11 +33,35 @@ public class AppsService { public AppDTO updateApp(AppDTO dto) { var newApp = dto.getId() == null; - var id = !newApp ? dto.getId() : appRepository.update(appTransformer.toAppEntity(dto)); + String appSecret = null; + + if(newApp) { + dto.setClientId(generateAppId()); + appSecret = generateAppSecret(); + dto.setClientSecret(passwordEncoder.encode(appSecret)); + } + + var id = appRepository.update(appTransformer.toAppEntity(dto)); + + if(newApp) { + dto.setId(id); + dto.setClientSecret(appSecret); + } return dto; } + private String generateAppId() { + return UUID.randomUUID().toString(); + } + + private String generateAppSecret() { + SecureRandom random = new SecureRandom(); + byte[] bytes = new byte[32]; + random.nextBytes(bytes); + return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); + } + public void deleteApp(Integer id) { appRepository.delete(id); } diff --git a/src/main/java/de/avatic/lcc/repositories/users/JwtTokenService.java b/src/main/java/de/avatic/lcc/service/apps/JwtTokenService.java similarity index 96% rename from src/main/java/de/avatic/lcc/repositories/users/JwtTokenService.java rename to src/main/java/de/avatic/lcc/service/apps/JwtTokenService.java index 5b3b683..8374a3d 100644 --- a/src/main/java/de/avatic/lcc/repositories/users/JwtTokenService.java +++ b/src/main/java/de/avatic/lcc/service/apps/JwtTokenService.java @@ -1,4 +1,4 @@ -package de.avatic.lcc.repositories.users; +package de.avatic.lcc.service.apps; import de.avatic.lcc.model.db.users.App; import de.avatic.lcc.model.db.users.Group; @@ -12,7 +12,6 @@ import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.security.Key; import java.util.Date; -import java.util.List; @Service public class JwtTokenService { @@ -28,7 +27,6 @@ public class JwtTokenService { public String createApplicationToken(App app, long expiration) { - return Jwts.builder() .issuer(baseUrl) .subject(app.getClientId()) diff --git a/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java index 767d83e..f5aef01 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java @@ -1,6 +1,6 @@ package de.avatic.lcc.service.transformer.apps; -import de.avatic.lcc.dto.users.AppDTO; +import de.avatic.lcc.dto.configuration.apps.AppDTO; import de.avatic.lcc.model.db.users.App; import de.avatic.lcc.model.db.users.Group; import org.springframework.stereotype.Service; diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 4e5e76c..1411bbd 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -137,7 +137,7 @@ CREATE TABLE IF NOT EXISTS `sys_user_node` FOREIGN KEY (`country_id`) REFERENCES `country` (`id`) ) COMMENT 'Contains user generated logistic nodes'; --- Main table for user information +-- Main table for app information CREATE TABLE IF NOT EXISTS `sys_app` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, @@ -147,7 +147,7 @@ CREATE TABLE IF NOT EXISTS `sys_app` ) COMMENT 'Stores basic information about external applications'; --- Junction table for user-group assignments +-- Junction table for app-group assignments CREATE TABLE IF NOT EXISTS `sys_app_group_mapping` ( `app_id` INT NOT NULL,