Skip to content

Commit

Permalink
Merge pull request #140 from Tech-Harbor/Bezsmertnyi
Browse files Browse the repository at this point in the history
Bezsmertnyi
  • Loading branch information
Vladik-gif authored Jul 3, 2024
2 parents 30282f0 + 4fa1e0a commit 230cc40
Show file tree
Hide file tree
Showing 36 changed files with 354 additions and 72 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ dependencies {
dependencies {
implementation group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.5.3.Final'
implementation 'com.cloudinary:cloudinary-http44:1.17.0'
implementation group: 'org.liquibase', name: 'liquibase-core', version: '4.24.0'
implementation group: 'org.mapstruct', name: 'mapstruct', version: '1.5.5.Final'
implementation group: 'org.freemarker', name: 'freemarker', version: '2.3.31'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.security.SecurityScheme;

import static com.example.backend.utils.general.Constants.*;

@OpenAPIDefinition(
info = @Info(
contact = @Contact(),
Expand All @@ -16,11 +18,11 @@
)
)
@SecurityScheme(
name = "Bearer Authentication",
name = BEARER_AUTHENTICATION,
description = "JWT auth description",
scheme = "Bearer",
scheme = BEARER,
type = SecuritySchemeType.HTTP,
bearerFormat = "JWT",
bearerFormat = JWT,
in = SecuritySchemeIn.HEADER
)
public class OpenApiSwaggerConfig { }
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import lombok.Builder;

import static com.example.backend.utils.general.Constants.EMPTY_FIELD;
import static com.example.backend.utils.general.Constants.PASSWORD_FORMAT_MESSAGE;

@Builder
public record PasswordRequest(
@NotNull @NotBlank(message = EMPTY_FIELD)
@Size(min = 7, max = 20)
@Pattern(regexp = "^(?=.*\\d)[A-Za-z\\d]+$",
message = "password має відповідати вказаному формату") String password) { }
@Pattern(regexp = "^(?=.*\\d)[A-Za-z\\d]+$", message = PASSWORD_FORMAT_MESSAGE) String password) { }
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import lombok.Builder;

import static com.example.backend.utils.general.Constants.EMPTY_FIELD;
import static com.example.backend.utils.general.Constants.PASSWORD_FORMAT_MESSAGE;

@Builder
public record RegisterRequest(
Expand All @@ -26,5 +27,4 @@ public record RegisterRequest(
@Size(min = 7, max = 35, message = "Довжина email має бути між 7 та 35 символами") String email,
@NotNull @NotBlank(message = EMPTY_FIELD)
@Size(min = 7, max = 20, message = "Довжина password має бути між 7 та 20 символами")
@Pattern(regexp = "^(?=.*\\d)[A-Za-z\\d]+$",
message = "password має відповідати вказаному формату") String password) { }
@Pattern(regexp = "^(?=.*\\d)[A-Za-z\\d]+$", message = PASSWORD_FORMAT_MESSAGE) String password) { }
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

import static com.example.backend.utils.enums.RegisterAuthStatus.GOOGLE;
import static com.example.backend.utils.enums.Role.USER;
import static com.example.backend.utils.enums.Status.ONLINE;
import static com.example.backend.utils.general.Constants.*;
import static com.example.backend.utils.general.MyPasswordEncoder.generateRandomPassword;

Expand Down Expand Up @@ -98,7 +97,6 @@ private UserEntity createUserEntity(final Map<String, Object> attributes, final
.registerAuthStatus(GOOGLE)
.roles(Set.of(USER))
.enabled(true)
.status(ONLINE)
.createData(LocalDateTime.now())
.password(passwordEncoder.passwordEncoder().encode(generateRandomPassword()))
.phone(attributes.getOrDefault("phone", EMPTY_LINE).toString())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
package com.example.backend.security.service.details;

import com.example.backend.utils.enums.Role;
import com.example.backend.web.User.store.dto.UserSecurityDTO;
import lombok.Builder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.stream.Collectors;

@Builder
public record MyUserDetails(UserSecurityDTO user) implements UserDetails {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.roles().stream()
.map(role -> new SimpleGrantedAuthority(role.name()))
.collect(Collectors.toSet());
public Collection<Role> getAuthorities() {
return user.roles();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import static com.example.backend.utils.enums.RegisterAuthStatus.JWT;
import static com.example.backend.utils.enums.Role.ADMIN;
import static com.example.backend.utils.enums.Role.USER;
import static com.example.backend.utils.enums.Status.OFFLINE;
import static com.example.backend.utils.exception.RequestException.badRequestException;

@Service
Expand Down Expand Up @@ -61,7 +60,6 @@ public void signup(final RegisterRequest registerRequest) {
.registerAuthStatus(JWT)
.enabled(false)
.roles(Set.of(USER, ADMIN))
.status(OFFLINE)
.build();

final var userSecurityDTO = userService.mySecuritySave(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private String generateJwtPasswordToken(final UserSecurityDTO userData) {
final Map<String, Object> claims = new HashMap<>();

claims.put(PASSWORD, userData.password());
claims.put(ROLE, userData.roles());
claims.put(ROLES, userData.roles());

return Jwts
.builder()
Expand All @@ -64,7 +64,7 @@ private String generateJwtPasswordToken(final UserSecurityDTO userData) {
private String generateJwtEmailToken(final UserSecurityDTO userData) {
final Map<String, Object> role = new HashMap<>();

role.put(ROLE, userData.roles());
role.put(ROLES, userData.roles());

return Jwts
.builder()
Expand All @@ -84,7 +84,7 @@ private String generateJwtAccessToken(final Map<String, Object> extraClaims, fin
final var userDetails = (MyUserDetails) authentication.getPrincipal();
final Map<String, Object> role = new HashMap<>();

role.put(ROLE, userDetails.user().roles());
role.put(ROLES, userDetails.user().roles());

return Jwts
.builder()
Expand All @@ -105,7 +105,7 @@ private String generateJwtRefreshToken(final Map<String, Object> extraClaims, fi
final var userDetails = (MyUserDetails) authentication.getPrincipal();
final Map<String, Object> role = new HashMap<>();

role.put(ROLE, userDetails.user().roles());
role.put(ROLES, userDetails.user().roles());

return Jwts
.builder()
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/example/backend/utils/enums/Delivery.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.backend.utils.enums;

import lombok.Getter;

import static com.example.backend.utils.general.Constants.DELIVERY_MESSAGE;

@Getter
public enum Delivery {
NOVA_POSHTA(DELIVERY_MESSAGE + "Нову Пошту"),
MEEST_EXPRESS(DELIVERY_MESSAGE + "Meest Express"),
JUSTIN(DELIVERY_MESSAGE + "Justin"),
UKRPOSHTA(DELIVERY_MESSAGE + "УкрПошту"),
PICKUP(DELIVERY_MESSAGE + "Самовивізом");

private final String name;

Delivery(final String name) {
this.name = name;
}
}
11 changes: 9 additions & 2 deletions src/main/java/com/example/backend/utils/enums/Role.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package com.example.backend.utils.enums;

public enum Role {
ADMIN, USER
import org.springframework.security.core.GrantedAuthority;

public enum Role implements GrantedAuthority {
ADMIN, USER;

@Override
public String getAuthority() {
return name();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public class Constants {
public static final String EMPTY_LINE = "";
public static final String COOK = "; Path=/; HttpOnly; SameSite=None; Secure";
public static final String PASSWORD = "password";
public static final String JWT = "JWT";
public static final String JWT = "jwt";
public static final String TYPE = "type";
public static final String ROLE = "role";
public static final String ROLES = "roles";
public static final String BEARER_AUTHENTICATION = "Bearer Authentication";
public static final String EMPTY_FIELD = "Поле не повинно бути порожнім";
public static final Date DATE_TIME_MILLIS = new Date(System.currentTimeMillis());
Expand All @@ -30,4 +30,6 @@ public class Constants {
public static final String[] GET_AUTH = {
"/api/accouth"
};
public static final String PASSWORD_FORMAT_MESSAGE = "password має відповідати вказаному формату";
public static final String DELIVERY_MESSAGE = "Доставка через: ";
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
public class MyPasswordEncoder {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
return new BCryptPasswordEncoder(12);
}

public static String generateRandomPassword() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.backend.utils.general;

import com.example.backend.web.Advertisement.AdvertisementRepository;
import com.example.backend.web.User.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@AllArgsConstructor
public class SchedulerProject {

private final AdvertisementRepository advertisementRepository;
private final UserRepository userRepository;

@Scheduled(fixedRate = 3600000)
public void deleteUsers() {
userRepository.deleteNotValidatedUsers(LocalDateTime.now().minusHours(1));
}

@Scheduled(cron = "0 0 0 1 * ?")
public void deleteActiveAdvertisement() {
advertisementRepository.deleteActiveAdvertisements(LocalDateTime.now());
}

@Scheduled(cron = "0 0 0 1 * ?")
public void updateActiveAdvertisement() {
advertisementRepository.updateActiveAdvertisements(LocalDateTime.now(), LocalDateTime.now());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.backend.utils.props;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "spring.socket")
public class WebSocketProperties {
private String[] destPrefixes;
private String appPrefix;
private String endpoint;
private String topicPrefix;
private String userPrefix;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,33 @@
package com.example.backend.web.Advertisement;

import com.example.backend.web.Advertisement.store.AdvertisementEntity;
import jakarta.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;

@Repository
public interface AdvertisementRepository extends JpaRepository<AdvertisementEntity, Long> {
AdvertisementEntity getByName(String name);

@Transactional
@Modifying
@Query("UPDATE AdvertisementEntity ad "
+ "SET ad.createDate = :now WHERE ad.updateActiveDate <= :updateDate AND ad.active = false")
void updateActiveAdvertisements(@Param("now") LocalDateTime now,
@Param("updateDate") LocalDateTime updateDate);

//TODO Поямнення updateActiveAdvertisements!
// 01.08.2022 створення без true, а стоїть false
// 01.09.2022 треба обновити дату всі які є на false
// 01.10.2022 видалиться через місяць, якщо не активують оголошення

@Transactional
@Modifying
@Query("DELETE FROM AdvertisementEntity ad WHERE ad.createDate <= :dateTime AND ad.active = false")
void deleteActiveAdvertisements(@Param("dateTime") LocalDateTime dateTime);
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,11 @@ public AdvertisementCreateDTO createAdvertisement(final String jwt,
.price(advertisement.price())
.images(imagesList)
.createDate(LocalDateTime.now())
.updateActiveDate(LocalDateTime.now())
.category(categoryName)
.delivery(advertisement.delivery())
.auction(advertisement.auction())
.active(advertisement.active())
.build();

return advertisementCreateFactory.apply(advertisementRepository.save(newAdvertisement));
Expand Down Expand Up @@ -86,6 +89,8 @@ public AdvertisementUpdateDTO editAdvertisement(final String jwt, final Advertis
final var user = helpers.tokenUserData(jwt);
final var idAdvertisement =
advertisementRepository.getReferenceById(user.getAdvertisements().get(0).getId());
final var auctionParse = String.valueOf(advertisementDTO.auction());
final var activeParse = String.valueOf(advertisementDTO.active());

if (StringUtils.isNoneEmpty(advertisementDTO.name())) {
idAdvertisement.setName(advertisementDTO.name());
Expand All @@ -99,7 +104,7 @@ public AdvertisementUpdateDTO editAdvertisement(final String jwt, final Advertis
idAdvertisement.setDescriptionAdvertisement(advertisementDTO.descriptionAdvertisement());
}

if (StringUtils.isNoneEmpty(advertisementDTO.delivery())) {
if (StringUtils.isNoneEmpty(advertisementDTO.delivery().toString())) {
idAdvertisement.setDelivery(advertisementDTO.delivery());
}

Expand All @@ -111,6 +116,14 @@ public AdvertisementUpdateDTO editAdvertisement(final String jwt, final Advertis
idAdvertisement.setPrice(advertisementDTO.price());
}

if (StringUtils.isNoneEmpty(auctionParse)) {
idAdvertisement.setAuction(advertisementDTO.auction());
}

if (StringUtils.isNoneEmpty(activeParse)) {
idAdvertisement.setAuction(advertisementDTO.active());
}

return advertisementUpdateFactory.apply(advertisementRepository.save(idAdvertisement));
}

Expand Down
Loading

0 comments on commit 230cc40

Please sign in to comment.