diff --git a/src/main/java/org/example/crm/controller/OrganizationController.java b/src/main/java/org/example/crm/controller/OrganizationController.java index 9bbb5ce..d4ef842 100644 --- a/src/main/java/org/example/crm/controller/OrganizationController.java +++ b/src/main/java/org/example/crm/controller/OrganizationController.java @@ -2,6 +2,7 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.example.crm.entity.dto.IdNameDto; import org.example.crm.entity.dto.organization.OrganizationCreateDto; import org.example.crm.entity.dto.organization.OrganizationDto; import org.example.crm.entity.dto.organization.OrganizationUpdateDto; @@ -14,6 +15,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/api/v1/organizations") @RequiredArgsConstructor @@ -51,4 +54,11 @@ public ResponseEntity delete(@PathVariable String id) { organizationService.delete(id); return ResponseEntity.noContent().build(); } + + + @GetMapping("/name") + public ResponseEntity> getByName() { + List organization = organizationService.getByName(); + return ResponseEntity.ok(organization); + } } \ No newline at end of file diff --git a/src/main/java/org/example/crm/controller/UserController.java b/src/main/java/org/example/crm/controller/UserController.java index a669820..784a313 100644 --- a/src/main/java/org/example/crm/controller/UserController.java +++ b/src/main/java/org/example/crm/controller/UserController.java @@ -2,6 +2,7 @@ import jakarta.validation.Valid; import org.example.crm.entity.dto.user.UserCreateDto; +import org.example.crm.entity.dto.user.UserCreatedResponseDto; import org.example.crm.entity.dto.user.UserDto; import org.example.crm.entity.dto.user.UserUpdateDto; import org.example.crm.filters.UserFilterDto; @@ -41,8 +42,8 @@ public ResponseEntity getById(@PathVariable String id) { @PreAuthorize("hasAuthority('EMPLOYEE_MANAGEMENT')") @PostMapping - public ResponseEntity create(@Valid @RequestBody UserCreateDto createDto) { - UserDto createdUser = userService.create(createDto); + public ResponseEntity create(@Valid @RequestBody UserCreateDto createDto) { + UserCreatedResponseDto createdUser = userService.createUser(createDto); return ResponseEntity.status(HttpStatus.CREATED).body(createdUser); } diff --git a/src/main/java/org/example/crm/entity/dto/IdNameDto.java b/src/main/java/org/example/crm/entity/dto/IdNameDto.java new file mode 100644 index 0000000..294e357 --- /dev/null +++ b/src/main/java/org/example/crm/entity/dto/IdNameDto.java @@ -0,0 +1,7 @@ +package org.example.crm.entity.dto; + +public record IdNameDto( + String id, + String name +) { +} diff --git a/src/main/java/org/example/crm/entity/dto/user/UserCreatedResponseDto.java b/src/main/java/org/example/crm/entity/dto/user/UserCreatedResponseDto.java new file mode 100644 index 0000000..10f5f8f --- /dev/null +++ b/src/main/java/org/example/crm/entity/dto/user/UserCreatedResponseDto.java @@ -0,0 +1,8 @@ +package org.example.crm.entity.dto.user; + +public record UserCreatedResponseDto( + String id, + String fullName, + String phone, + String temporaryPassword +) {} \ No newline at end of file diff --git a/src/main/java/org/example/crm/repository/UserRepository.java b/src/main/java/org/example/crm/repository/UserRepository.java index 7bc1023..14bdf44 100644 --- a/src/main/java/org/example/crm/repository/UserRepository.java +++ b/src/main/java/org/example/crm/repository/UserRepository.java @@ -60,4 +60,6 @@ public interface UserRepository extends JpaRepository { @Transactional @Query("UPDATE User u SET u.imageUrl =:imageUrl where u.id=:userId and u.deleted = false") void updateUserImage(@Param("userId") String userId, @Param("imageUrl") String presignedUrl); + + boolean existsByPhone(String phone); } diff --git a/src/main/java/org/example/crm/service/OrganizationService.java b/src/main/java/org/example/crm/service/OrganizationService.java index 383ed66..110a946 100644 --- a/src/main/java/org/example/crm/service/OrganizationService.java +++ b/src/main/java/org/example/crm/service/OrganizationService.java @@ -1,6 +1,7 @@ package org.example.crm.service; +import org.example.crm.entity.dto.IdNameDto; import org.example.crm.entity.dto.organization.OrganizationCreateDto; import org.example.crm.entity.dto.organization.OrganizationDto; import org.example.crm.entity.dto.organization.OrganizationUpdateDto; @@ -14,6 +15,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class OrganizationService extends AbstractService< OrganizationRepository, @@ -63,4 +66,13 @@ public void delete(String id) { validator.validateOrganizationMatch(id, organizationId); repository.softDelete(id); } + + public List getByName() { + String organizationId = userValidator.authenticateAndGetOrganizationId(); + validator.validateAndGetId(organizationId); + List organizations = repository.findAll(); + return organizations.stream() + .map(organization -> new IdNameDto(organization.getId(), organization.getName())) + .toList(); + } } diff --git a/src/main/java/org/example/crm/service/UserService.java b/src/main/java/org/example/crm/service/UserService.java index 77d0f45..f918a1b 100644 --- a/src/main/java/org/example/crm/service/UserService.java +++ b/src/main/java/org/example/crm/service/UserService.java @@ -1,9 +1,9 @@ package org.example.crm.service; import org.example.crm.entity.dto.user.UserCreateDto; +import org.example.crm.entity.dto.user.UserCreatedResponseDto; import org.example.crm.entity.dto.user.UserDto; import org.example.crm.entity.dto.user.UserUpdateDto; -import org.example.crm.entity.model.Organization; import org.example.crm.exceptions.ErrorCodes; import org.example.crm.exceptions.ErrorType; import org.example.crm.entity.model.Branch; @@ -18,9 +18,11 @@ import org.example.crm.validator.UserValidator; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.security.SecureRandom; + @Service public class UserService extends AbstractService< UserRepository, @@ -30,12 +32,21 @@ public class UserService extends AbstractService< final BranchRepository branchRepository; final BranchValidator branchValidator; final OrganizationValidator organizationValidator; + final PasswordEncoder passwordEncoder; + + private static final String CHARACTERS = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "abcdefghijklmnopqrstuvwxyz" + + "0123456789"; + + private static final SecureRandom RANDOM = new SecureRandom(); - protected UserService(UserRepository repository, UserMapper mapper, UserValidator validator, BranchRepository branchRepository, BranchValidator branchValidator, OrganizationValidator organizationValidator) { + protected UserService(UserRepository repository, UserMapper mapper, UserValidator validator, BranchRepository branchRepository, BranchValidator branchValidator, OrganizationValidator organizationValidator, PasswordEncoder passwordEncoder) { super(repository, mapper, validator); this.branchRepository = branchRepository; this.branchValidator = branchValidator; this.organizationValidator = organizationValidator; + this.passwordEncoder = passwordEncoder; } @Override @@ -52,13 +63,25 @@ public UserDto get(String id) { @Override public UserDto create(UserCreateDto createDto) { + return null; + } + + + public UserCreatedResponseDto createUser(UserCreateDto createDto) { validator.validate(createDto); User entity = mapper.toEntity(createDto); validator.validateUserPermission(entity); + String password = generatePassword(10); + entity.setPassword(passwordEncoder.encode(password)); Branch branch = branchValidator.validateIdAndGet(createDto.branchId()); entity.setBranch(branch); User save = repository.save(entity); - return mapper.toDto(save); + return new UserCreatedResponseDto( + save.getId(), + save.getFullName(), + save.getPhone(), + password + ); } @Override @@ -80,4 +103,15 @@ public void delete(String id) { throw new RestException(ErrorType.FORBIDDEN, ErrorCodes.Unauthorized); } } + + public static String generatePassword(int length) { + StringBuilder password = new StringBuilder(length); + + for (int i = 0; i < length; i++) { + int index = RANDOM.nextInt(CHARACTERS.length()); + password.append(CHARACTERS.charAt(index)); + } + + return password.toString(); + } } diff --git a/src/main/java/org/example/crm/validator/UserValidator.java b/src/main/java/org/example/crm/validator/UserValidator.java index f2db555..9559457 100644 --- a/src/main/java/org/example/crm/validator/UserValidator.java +++ b/src/main/java/org/example/crm/validator/UserValidator.java @@ -26,7 +26,9 @@ public User validateIdAndGet(String id) { } public void validate(UserCreateDto createDto) { - + if (repository.existsByPhone(createDto.phone())) { + throw new RestException(ErrorType.USER_ALREADY_EXISTS, ErrorCodes.BadRequest); + } } public User authenticateAndGetUser(){