Skip to content

Commit

Permalink
Implementation of Login Process (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rapter1990 authored Mar 31, 2023
1 parent 5c6df1c commit 69d98b8
Show file tree
Hide file tree
Showing 38 changed files with 611 additions and 419 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/ays/backend/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Excepti
.authorizeHttpRequests()
.requestMatchers(HttpMethod.GET, "/swagger-ui/**", "/v3/api-docs/**").permitAll()
.requestMatchers(HttpMethod.POST, "/api/v1/admin/register").permitAll()
.requestMatchers(HttpMethod.POST, "/api/v1/admin/login").permitAll()
.requestMatchers(HttpMethod.GET, "/h2-console/**").permitAll()
.anyRequest().authenticated();

httpSecurity.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.ays.backend.mapper;

import com.ays.backend.user.controller.payload.request.AdminRegisterRequest;
import com.ays.backend.user.model.entities.User;
import com.ays.backend.user.model.entities.UserEntity;
import org.mapstruct.Mapper;

@Mapper
public interface UserAdminRegisterRequestToUserEntityMapper extends BaseMapper<AdminRegisterRequest, User> {
public interface UserAdminRegisterRequestToUserEntityMapper extends BaseMapper<AdminRegisterRequest, UserEntity> {

}
10 changes: 5 additions & 5 deletions src/main/java/com/ays/backend/mapper/UserMapper.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.ays.backend.mapper;

import com.ays.backend.user.controller.payload.request.UpdateUserRequest;
import com.ays.backend.user.model.entities.User;
import com.ays.backend.user.service.dto.UserDTO;
import com.ays.backend.user.model.User;
import com.ays.backend.user.model.entities.UserEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
Expand All @@ -14,11 +14,11 @@
// extends BaseMapper<User, UserDTO>
public interface UserMapper {

User mapUserDTOtoUser(UserDTO userDTO);
UserEntity mapUserToUserEntity(User user);

UserDTO mapUsertoUserDTO(User user);
User mapUserEntityToUser(UserEntity userEntity);

@Mapping(target = "id", ignore = true)
User mapUpdateRequestToUser(UpdateUserRequest updateUserRequest, @MappingTarget User user);
com.ays.backend.user.model.entities.UserEntity mapUpdateRequestToUser(UpdateUserRequest updateUserRequest, @MappingTarget com.ays.backend.user.model.entities.UserEntity user);

}
29 changes: 23 additions & 6 deletions src/main/java/com/ays/backend/user/controller/AuthController.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.ays.backend.user.controller;

import com.ays.backend.user.controller.payload.request.AdminLoginRequest;
import com.ays.backend.user.controller.payload.request.AdminRegisterRequest;
import com.ays.backend.user.controller.payload.response.AuthResponse;
import com.ays.backend.user.controller.payload.response.MessageResponse;
import com.ays.backend.user.security.JwtTokenProvider;
import com.ays.backend.user.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -23,10 +23,6 @@ public class AuthController {

private final AuthService authService;

private final AuthenticationManager authenticationManager;

private final JwtTokenProvider jwtTokenProvider;


/**
* This endpoint allows admin to register to platform.
Expand All @@ -46,4 +42,25 @@ public ResponseEntity<MessageResponse> register(@RequestBody AdminRegisterReques
return new ResponseEntity<>(messageResponse, HttpStatus.CREATED);
}


/**
* This endpoint allows admin to login to platform.
*
* @param loginRequest A AdminLoginRequest object required to register to platform .
* @return A ResponseEntity containing an AuthResponse object and the HTTP status code (200 OK).
*/
@PostMapping("/login")
public ResponseEntity<AuthResponse> login(@RequestBody AdminLoginRequest loginRequest) {

final var aysToken = authService.login(loginRequest);

AuthResponse authResponse = AuthResponse.builder()
.accessTokenExpireIn(aysToken.getAccessTokenExpireIn())
.refreshToken(aysToken.getRefreshToken())
.accessToken(aysToken.getAccessToken())
.build();

return new ResponseEntity<>(authResponse, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import com.ays.backend.user.controller.payload.request.UpdateUserRequest;
import com.ays.backend.user.controller.payload.response.SignUpResponse;
import com.ays.backend.user.exception.UserAlreadyExistsException;
import com.ays.backend.user.model.User;
import com.ays.backend.user.service.UserService;
import com.ays.backend.user.service.dto.UserDTO;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand All @@ -30,7 +30,7 @@ public class UserController {
*
* @param signUpRequest A SignUpRequest object containing the username and password of the new user (required).
* @return A ResponseEntity containing a SignUpResponse object with the username of the newly created user and
* the HTTP status code (201 CREATED).
* the HTTP status code (201 CREATED).
* @throws UserAlreadyExistsException If the username provided in the request body already exists in the database.
*/
@PostMapping
Expand All @@ -50,7 +50,7 @@ public ResponseEntity<SignUpResponse> registerUser(@RequestBody @Valid SignUpReq
* @return A ResponseEntity containing a Page object with UserDTOs and the HTTP status code (200 OK).
*/
@GetMapping
public ResponseEntity<Page<UserDTO>> getUsers(PaginationRequest paginationRequest) {
public ResponseEntity<Page<User>> getUsers(PaginationRequest paginationRequest) {
Pageable pageable = PageRequest.of(paginationRequest.getPage(), paginationRequest.getPageSize());
return new ResponseEntity<>(userService.getAllUsers(pageable), HttpStatus.OK);
}
Expand All @@ -62,15 +62,15 @@ public ResponseEntity<Page<UserDTO>> getUsers(PaginationRequest paginationReques
* @return A ResponseEntity containing a UserDTO object with the specified ID and the HTTP status code (200 OK).
*/
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUserById(@PathVariable Long id){
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return new ResponseEntity<>(userService.getUserById(id), HttpStatus.OK);
}


/**
* This endpoint returns a UserDTO object by deleting the user softly with the specified ID.
* @param id A Long representing the ID of the user to retrieve (required).
*
* @param id A Long representing the ID of the user to retrieve (required).
*/
@DeleteMapping("/{id}")
public void deleteSoftUserById(@PathVariable Long id) {
Expand All @@ -82,10 +82,10 @@ public void deleteSoftUserById(@PathVariable Long id) {
*
* @param updateUserRequest UpdateUserRequest for updating the user
* @return A ResponseEntity containing a UserDTO object after implementing the process of updating user
* with the specified ID by and the HTTP status code (200 OK).
* with the specified ID by and the HTTP status code (200 OK).
*/
@PutMapping
public ResponseEntity<UserDTO> updateUserById(@RequestBody UpdateUserRequest updateUserRequest) {
public ResponseEntity<User> updateUserById(@RequestBody UpdateUserRequest updateUserRequest) {
return new ResponseEntity<>(userService.updateUserById(updateUserRequest), HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.ays.backend.user.controller.payload.request;

import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class AdminLoginRequest {

@NotBlank
private String username;

@NotBlank
private String password;

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ public class AdminRegisterRequest {
@Email
private String email;

@NotNull
private Long organizationId;

@NotNull
private Integer statusValue;
//@NotNull
//private Long organizationId;

}
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package com.ays.backend.user.controller.payload.request;

import com.ays.backend.user.model.entities.Organization;
import com.ays.backend.user.model.enums.UserRole;
import com.ays.backend.user.model.enums.UserStatus;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Builder
@Data
@AllArgsConstructor
public class UpdateUserRequest {

private Long id;
private String organizationId;
private String username;
private String firstName;
private String lastName;
private String email;
private Organization organization;
private UserRole userRole;
private UserStatus userStatus;
private int countryCode;
private int lineNumber;
private Integer countryCode;
private Integer lineNumber;

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
@Data
@Builder
public class AuthResponse {
String message;
String accessToken;

private String accessToken;
private Long accessTokenExpireIn;
private String refreshToken;
}
14 changes: 14 additions & 0 deletions src/main/java/com/ays/backend/user/model/Token.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.ays.backend.user.model;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class Token {

private String accessToken;
private Long accessTokenExpireIn;
private String refreshToken;

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.ays.backend.user.service.dto;
package com.ays.backend.user.model;

import com.ays.backend.user.model.entities.Organization;
import com.ays.backend.user.model.entities.User;
import com.ays.backend.user.model.entities.OrganizationEntity;
import com.ays.backend.user.model.enums.UserRole;
import com.ays.backend.user.model.enums.UserStatus;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

Expand All @@ -16,16 +17,18 @@
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class UserDTO {
public class User {

private String username;
private String password;
private String firstName;
private String lastName;
private String email;
private Organization organization;
private UserRole userRole;
private UserStatus userStatus;
private int countryCode;
private int lineNumber;
private OrganizationEntity organization;
private UserRole role;
private UserStatus status;
private Integer countryCode; // TODO : create PhoneNumber object
private Integer lineNumber; // TODO : create PhoneNumber object
private LocalDateTime lastLoginDate;

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
*/
@Entity
@Table(name = "organization")
public class Organization extends BaseEntity {
public class OrganizationEntity extends BaseEntity {

@Column(nullable = false)
private String name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Deprecated(since = "Servisi kaldırıldığında silinmeli")
public class RefreshToken {

@Id
Expand All @@ -25,7 +26,7 @@ public class RefreshToken {

@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
private UserEntity user;

@Column(nullable = false, unique = true)
private String token;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
*/
@Entity
@Table(name = "user",
uniqueConstraints={
@UniqueConstraint(name = "UniqueMobileNumber", columnNames = {"countryCode", "lineNumber"})
})
uniqueConstraints = {
@UniqueConstraint(name = "UniqueMobileNumber", columnNames = {"countryCode", "lineNumber"})
})
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Builder
public class User extends BaseEntity {
public class UserEntity extends BaseEntity {

@Column(unique = true, nullable = false)
private String username;
Expand All @@ -43,11 +43,11 @@ public class User extends BaseEntity {

@OneToOne
@JoinColumn(name = "organization_id", referencedColumnName = "id", insertable = false, updatable = false)
private Organization organization;
private OrganizationEntity organization;

@Enumerated(EnumType.ORDINAL)
@JoinColumn(name = "type_id")
private UserRole userRole;
private UserRole role;

@Enumerated(EnumType.ORDINAL)
@JoinColumn(name = "status_id")
Expand All @@ -66,20 +66,24 @@ public class User extends BaseEntity {
@Column(name = "organization_id")
private Long organizationId;

public static User from(AdminRegisterRequest registerRequest, PasswordEncoder passwordEncoder) {
public void deleteUser() {
this.status = UserStatus.DELETED;
}

public static UserEntity from(AdminRegisterRequest registerRequest, PasswordEncoder passwordEncoder) {

return User.builder()
return UserEntity.builder()
.username(registerRequest.getUsername())
.password(passwordEncoder.encode(registerRequest.getPassword()))
.firstName(registerRequest.getFirstName())
.lastName(registerRequest.getLastName())
.userRole(UserRole.ROLE_ADMIN)
.role(UserRole.ROLE_ADMIN)
.countryCode(registerRequest.getCountryCode())
.lineNumber(registerRequest.getLineNumber())
.email(registerRequest.getEmail())
.lastLoginDate(LocalDateTime.now())
.organizationId(registerRequest.getOrganizationId())
.status(UserStatus.getById(registerRequest.getStatusValue()))
//.organizationId(registerRequest.getOrganizationId())
.status(UserStatus.WAITING)
.build();

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.ays.backend.user.model.enums;

/**
* Enumeration keeping user status.
*/
public enum UserStatus {

WAITING,
VERIFIED,
COMPLETED,
OCCUPIED,
ACTIVE,
PASSIVE,
OCCUPIED;
DELETED;

public static UserStatus getById(int userStatusId) {
return UserStatus.values()[userStatusId];
Expand Down
Loading

0 comments on commit 69d98b8

Please sign in to comment.