From 3b05befa92798bab797e4d15c19f9ebf87688e62 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 19 Oct 2025 13:05:00 +0200 Subject: [PATCH] added missing changes to perious commit --- .../users/UserNodeRepository.java | 49 ++++++++++++------- .../lcc/service/access/UserNodeService.java | 14 ++++-- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java index 16ff543..1c9f002 100644 --- a/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java @@ -7,11 +7,15 @@ import de.avatic.lcc.util.exception.base.ForbiddenException; import de.avatic.lcc.util.exception.internalerror.DatabaseException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.util.*; @Repository @@ -24,7 +28,7 @@ public class UserNodeRepository { this.jdbcTemplate = jdbcTemplate; } - + @Transactional public Collection searchNode(String filter, int limit, int userId, boolean excludeDeprecated) { StringBuilder queryBuilder = new StringBuilder().append("SELECT * FROM sys_user_node WHERE user_id = ?"); @@ -49,28 +53,36 @@ public class UserNodeRepository { return jdbcTemplate.query(queryBuilder.toString(), new NodeMapper(), params.toArray()); } - public void add(Integer userId, Node node) { + @Transactional + public Integer add(Integer userId, Node node) { String sql = """ - INSERT INTO sys_user_node ( - name, address, geo_lat, geo_lng, - is_deprecated, country_id, user_id - ) VALUES (?, ?, ?, ?, ?, ?, ?) - """; + INSERT INTO sys_user_node ( + name, address, geo_lat, geo_lng, + is_deprecated, country_id, user_id + ) VALUES (?, ?, ?, ?, ?, ?, ?) + """; - var affectedRows = jdbcTemplate.update(sql, - node.getName(), - node.getAddress(), - node.getGeoLat(), - node.getGeoLng(), - node.getDeprecated(), - node.getCountryId(), - userId - ); + KeyHolder keyHolder = new GeneratedKeyHolder(); - if(affectedRows != 1) + int affectedRows = jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + ps.setString(1, node.getName()); + ps.setString(2, node.getAddress()); + ps.setBigDecimal(3, node.getGeoLat()); + ps.setBigDecimal(4, node.getGeoLng()); + ps.setBoolean(5, node.getDeprecated()); + ps.setInt(6, node.getCountryId()); + ps.setInt(7, userId); + return ps; + }, keyHolder); + + if (affectedRows != 1) throw new DatabaseException("Could not add node to user"); + + return Objects.requireNonNull(keyHolder.getKey()).intValue(); } + @Transactional public Optional getById(Integer id) { String query = "SELECT * FROM sys_user_node WHERE id = ?"; @@ -82,6 +94,7 @@ public class UserNodeRepository { return Optional.of(nodes.getFirst()); } + @Transactional public List findNodeListsForReportingByPeriodId(Integer materialId, ValidityTuple tuple) { String userSuppliersSql = """ SELECT DISTINCT un.* @@ -99,6 +112,7 @@ public class UserNodeRepository { } + @Transactional public Collection getByIds(List nodeIds) { String placeholders = String.join(",", Collections.nCopies(nodeIds.size(), "?")); String query = """ @@ -109,6 +123,7 @@ public class UserNodeRepository { return nodeIds.isEmpty() ? Collections.emptyList() : jdbcTemplate.query(query, new NodeMapper(), nodeIds.toArray()); } + @Transactional public Optional getOwnerById(Integer userSupplierId) { String query = """ diff --git a/src/main/java/de/avatic/lcc/service/access/UserNodeService.java b/src/main/java/de/avatic/lcc/service/access/UserNodeService.java index 14cff17..e6598df 100644 --- a/src/main/java/de/avatic/lcc/service/access/UserNodeService.java +++ b/src/main/java/de/avatic/lcc/service/access/UserNodeService.java @@ -1,10 +1,12 @@ package de.avatic.lcc.service.access; import de.avatic.lcc.dto.configuration.nodes.userNodes.AddUserNodeDTO; +import de.avatic.lcc.dto.generic.NodeDTO; import de.avatic.lcc.model.country.IsoCode; import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.country.CountryRepository; import de.avatic.lcc.repositories.users.UserNodeRepository; +import de.avatic.lcc.service.transformer.generic.NodeTransformer; import de.avatic.lcc.service.users.AuthorizationService; import de.avatic.lcc.util.exception.badrequest.InvalidArgumentException; import de.avatic.lcc.util.exception.badrequest.NotFoundException; @@ -17,11 +19,13 @@ public class UserNodeService { private final CountryRepository countryRepository; private final UserNodeRepository userNodeRepository; private final AuthorizationService authorizationService; + private final NodeTransformer nodeTransformer; - public UserNodeService(CountryRepository countryRepository, UserNodeRepository userNodeRepository, AuthorizationService authorizationService) { + public UserNodeService(CountryRepository countryRepository, UserNodeRepository userNodeRepository, AuthorizationService authorizationService, NodeTransformer nodeTransformer) { this.countryRepository = countryRepository; this.userNodeRepository = userNodeRepository; this.authorizationService = authorizationService; + this.nodeTransformer = nodeTransformer; } public Node getUserNode(Integer id) { @@ -35,9 +39,7 @@ public class UserNodeService { * address, geographic location, and country information. * @throws IllegalArgumentException if any required information in the DTO is missing or invalid. */ - public void addUserNode(AddUserNodeDTO dto) { - - // TODO: get real user id. + public NodeDTO addUserNode(AddUserNodeDTO dto) { var userId = authorizationService.getUserId(); Node node = new Node(); @@ -60,6 +62,8 @@ public class UserNodeService { node.setCountryId(countryRepository.getByIsoCode(IsoCode.valueOf(dto.getCountry().getIsoCode())).orElseThrow(() -> new NotFoundException(NotFoundException.NotFoundType.COUNTRY, "iso code", dto.getCountry().getIsoCode())).getId()); - userNodeRepository.add(userId, node); + var id = userNodeRepository.add(userId, node); + + return nodeTransformer.toNodeDTO(userNodeRepository.getById(id).orElseThrow()); } }