Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -51,4 +54,11 @@ public ResponseEntity<Void> delete(@PathVariable String id) {
organizationService.delete(id);
return ResponseEntity.noContent().build();
}


@GetMapping("/name")
public ResponseEntity<List<IdNameDto>> getByName() {
List<IdNameDto> organization = organizationService.getByName();
return ResponseEntity.ok(organization);
}
}
5 changes: 3 additions & 2 deletions src/main/java/org/example/crm/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -41,8 +42,8 @@ public ResponseEntity<UserDto> getById(@PathVariable String id) {

@PreAuthorize("hasAuthority('EMPLOYEE_MANAGEMENT')")
@PostMapping
public ResponseEntity<UserDto> create(@Valid @RequestBody UserCreateDto createDto) {
UserDto createdUser = userService.create(createDto);
public ResponseEntity<UserCreatedResponseDto> create(@Valid @RequestBody UserCreateDto createDto) {
UserCreatedResponseDto createdUser = userService.createUser(createDto);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/org/example/crm/entity/dto/IdNameDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.example.crm.entity.dto;

public record IdNameDto(
String id,
String name
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example.crm.entity.dto.user;

public record UserCreatedResponseDto(
String id,
String fullName,
String phone,
String temporaryPassword
) {}
2 changes: 2 additions & 0 deletions src/main/java/org/example/crm/repository/UserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,6 @@ public interface UserRepository extends JpaRepository<User, String> {
@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);
}
12 changes: 12 additions & 0 deletions src/main/java/org/example/crm/service/OrganizationService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -63,4 +66,13 @@ public void delete(String id) {
validator.validateOrganizationMatch(id, organizationId);
repository.softDelete(id);
}

public List<IdNameDto> getByName() {
String organizationId = userValidator.authenticateAndGetOrganizationId();
validator.validateAndGetId(organizationId);
List<Organization> organizations = repository.findAll();
return organizations.stream()
.map(organization -> new IdNameDto(organization.getId(), organization.getName()))
.toList();
}
}
42 changes: 38 additions & 4 deletions src/main/java/org/example/crm/service/UserService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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,
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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();
}
}
4 changes: 3 additions & 1 deletion src/main/java/org/example/crm/validator/UserValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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(){
Expand Down