Skip to content

Commit

Permalink
Merge pull request #150 from Tech-Harbor/Bezsmertnyi
Browse files Browse the repository at this point in the history
Bezsmertnyi
  • Loading branch information
Vladik-gif authored Sep 4, 2024
2 parents 4a4c5a9 + 60c4a0d commit 5b5b851
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@
import jakarta.servlet.http.HttpServletResponse;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.auth.InvalidCredentialsException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -66,12 +70,7 @@ public void signup(final RegisterRequest registerRequest) {

@Override
public AuthResponse login(final AuthRequest authRequest) {
final var authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
authRequest.email(),
authRequest.password()
)
);
final var authentication = authenticateCredentials(authRequest.email(), authRequest.password());

SecurityContextHolder.getContext().setAuthentication(authentication);

Expand Down Expand Up @@ -153,7 +152,7 @@ public void updateRefreshToken(final HttpServletRequest request, final HttpServl
jwtAuthServerFilter.updateRefreshTokenFilter(request, response);
}

private UserEntity createUserEntity(RegisterRequest registerRequest) {
private UserEntity createUserEntity(final RegisterRequest registerRequest) {
return UserEntity.builder()
.firstname(registerRequest.firstname())
.lastname(registerRequest.lastname())
Expand All @@ -168,4 +167,13 @@ private UserEntity createUserEntity(RegisterRequest registerRequest) {
.roles(Set.of(USER, ADMIN))
.build();
}
}

@SneakyThrows
private Authentication authenticateCredentials(final String email, final String password) {
try {
return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(email, password));
} catch (AuthenticationException e) {
throw new InvalidCredentialsException("Authentication failed, invalid email or password");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@ public class Constants {
};
public static final String PASSWORD_FORMAT_MESSAGE = "password має відповідати вказаному формату";
public static final String DELIVERY_MESSAGE = "Доставка через: ";
public static final String BEARER_JWT_TEST = "Bearer some-jwt-token";
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
package com.example.backend.utils.general;

import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.Base64;

@Component
public class MyPasswordEncoder implements PasswordEncoder{
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
public String encode(final CharSequence rawPassword) {
return new BCryptPasswordEncoder().encode(rawPassword);
}

@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return false;
public boolean matches(final CharSequence rawPassword, final String encodedPassword) {
return new BCryptPasswordEncoder().matches(rawPassword, encodedPassword);
}

public static String generateRandomPassword() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import com.example.backend.web.Advertisement.store.dto.AdvertisementUpdateDTO;
import com.example.backend.web.Advertisement.store.mapper.AdvertisementMapper;
import com.example.backend.web.Category.CategoryServer;
import com.example.backend.web.Category.store.CategoryEntity;
import com.example.backend.web.File.ImageServer;
import com.example.backend.web.File.store.ImageEntity;
import com.example.backend.web.User.UserServer;
import com.example.backend.web.User.store.UserEntity;
import jakarta.transaction.Transactional;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -45,19 +47,7 @@ public AdvertisementCreateDTO createAdvertisement(final String jwt,
imagesList.add(imageServer.uploadImageEntity(file));
}

final var newAdvertisement = AdvertisementEntity.builder()
.user(userName)
.name(advertisement.name())
.descriptionAdvertisement(advertisement.descriptionAdvertisement())
.price(advertisement.price())
.images(imagesList)
.createDate(LocalDateTime.now())
.updateActiveDate(LocalDateTime.now())
.category(categoryName)
.delivery(advertisement.delivery())
.auction(advertisement.auction())
.active(advertisement.active())
.build();
final var newAdvertisement = getNewAdvertisement(advertisement, userName, imagesList, categoryName);

return advertisementMapper.advertisementMapperCreateDTO(advertisementRepository.save(newAdvertisement));
}
Expand Down Expand Up @@ -87,6 +77,51 @@ public AdvertisementUpdateDTO editAdvertisement(final String jwt, final Advertis
final var auctionParse = String.valueOf(advertisementDTO.auction());
final var activeParse = String.valueOf(advertisementDTO.active());

extracted(advertisementDTO, idAdvertisement, auctionParse, activeParse);

return advertisementMapper.advertisementMapperUpdateDTO(advertisementRepository.save(idAdvertisement));
}

@Override
@Transactional
public void deleteAdvertisement(final String jwt) {
final var user = helpers.tokenUserData(jwt);
final var advertisementRepositoryByName =
advertisementRepository.getByName(user.getAdvertisements().get(0).getName());

advertisementRepository.delete(advertisementRepositoryByName);
}

@Override
@Transactional
public void deleteAll(final String jwt) {
helpers.tokenUserData(jwt);
advertisementRepository.deleteAll();
}

private static AdvertisementEntity getNewAdvertisement(final AdvertisementCreateDTO advertisement,
final UserEntity userName,
final ArrayList<ImageEntity> imagesList,
final CategoryEntity categoryName) {
return AdvertisementEntity.builder()
.user(userName)
.name(advertisement.name())
.descriptionAdvertisement(advertisement.descriptionAdvertisement())
.price(advertisement.price())
.images(imagesList)
.createDate(LocalDateTime.now())
.updateActiveDate(LocalDateTime.now())
.category(categoryName)
.delivery(advertisement.delivery())
.auction(advertisement.auction())
.active(advertisement.active())
.build();
}

private void extracted(final AdvertisementUpdateDTO advertisementDTO,
final AdvertisementEntity idAdvertisement,
final String auctionParse,
final String activeParse) {
if (StringUtils.isNoneEmpty(advertisementDTO.name())) {
idAdvertisement.setName(advertisementDTO.name());
}
Expand Down Expand Up @@ -118,24 +153,5 @@ public AdvertisementUpdateDTO editAdvertisement(final String jwt, final Advertis
if (StringUtils.isNoneEmpty(activeParse)) {
idAdvertisement.setAuction(advertisementDTO.active());
}

return advertisementMapper.advertisementMapperUpdateDTO(advertisementRepository.save(idAdvertisement));
}

@Override
@Transactional
public void deleteAdvertisement(final String jwt) {
final var user = helpers.tokenUserData(jwt);
final var advertisementRepositoryByName =
advertisementRepository.getByName(user.getAdvertisements().get(0).getName());

advertisementRepository.delete(advertisementRepositoryByName);
}

@Override
@Transactional
public void deleteAll(final String jwt) {
helpers.tokenUserData(jwt);
advertisementRepository.deleteAll();
}
}
19 changes: 8 additions & 11 deletions src/main/resources/liquibase/db/v1_init.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
create SCHEMA IF NOT EXISTS oranger;

create table if not exists advertisements (
id bigserial primary key,
active boolean not null,
Expand All @@ -22,20 +24,20 @@ create table if not exists images (
image_id varchar(255),
image_url varchar(255),
name varchar(255),
advertisement_id bigint constraint fkjibg9bsoybl2g8x1kdpgvgcvx references advertisements
advertisement_id bigint constraint images_constraint_advertisements_id references advertisements
);

create table if not exists categories (
id bigserial primary key,
name varchar(255) not null,
image_id bigint
constraint uk_6b3bn760mqxmhflt089q8ba00 unique constraint fkqhmw54g2p4xu0k71mblvlqfvi references images
constraint categories_constraint unique constraint images_constraint references images
);

create table if not exists users (
id bigserial primary key,
create_data timestamp(6),
email varchar(255) not null constraint uk_6dotkott2kjsp8vw4d0m25fb7 unique,
email varchar(255) not null constraint email_constraint unique,
enabled boolean,
account_expired boolean,
account_locked boolean,
Expand All @@ -49,13 +51,8 @@ create table if not exists users (
((ARRAY ['GOOGLE'::character varying, 'JWT'::character varying])::text[])),
roles varchar(255)[],
image_id bigint
constraint uk_94dj9ry3k3tmcsyg8eatp7vvn unique constraint fk17herqt2to4hyl5q5r5ogbxk9 references images
constraint users_constraint unique constraint image_constraint references images
);

alter table advertisements
add constraint fkj69sc4qf7g4p52q8vl0hqvbmp
foreign key (user_id) references users;

alter table advertisements
add constraint fkq2bx00e2ngwnvvuneonbnemvj
foreign key (category_id) references categories;
alter table advertisements add constraint advertisements_constraint_user_id foreign key (user_id) references users;
alter table advertisements add constraint advertisements_constraint foreign key (category_id) references categories;
16 changes: 5 additions & 11 deletions src/test/java/com/example/backend/security/AuthServerImplTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.Optional;
import java.util.Properties;

import static com.example.backend.utils.general.Constants.EMAIL_KEY;
import static com.example.backend.utils.general.Constants.PASSWORD;
import static com.example.backend.utils.general.Constants.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
Expand Down Expand Up @@ -147,8 +145,6 @@ void loginNotTest() {

@Test
void formUpdatePasswordTest() {
final var jwt = "Bearer some-jwt-token";

final var passwordRequest = PasswordRequest.builder()
.password(PASSWORD)
.build();
Expand All @@ -163,10 +159,10 @@ void formUpdatePasswordTest() {
when(helpers.tokenUserEmail(anyString())).thenReturn(Optional.of(user));
when(myPasswordEncoder.encode(PASSWORD)).thenReturn(PASSWORD);

authService.formUpdatePassword(jwt, passwordRequest);
authService.formUpdatePassword(BEARER_JWT_TEST, passwordRequest);

assertEquals(PASSWORD, user.getPassword());
verify(helpers).tokenUserEmail(jwt);
verify(helpers).tokenUserEmail(BEARER_JWT_TEST);
verify(myPasswordEncoder).encode(passwordRequest.password());
verify(mailServer).sendEmail(userSecurity, MailType.UPDATED_PASSWORD, new Properties());
}
Expand All @@ -193,19 +189,17 @@ void requestEmailUpdatePasswordTest() {

@Test
void activeUserTest() {
final var jwt = "Bearer some-jwt-token";

final var userEntity = UserEntity.builder()
.email(EMAIL_KEY)
.enabled(false)
.build();

when(helpers.tokenUserEmail(anyString())).thenReturn(Optional.of(userEntity));

authService.activeUser(jwt);
authService.activeUser(BEARER_JWT_TEST);

assertTrue(userEntity.getEnabled());
verify(helpers).tokenUserEmail(jwt);
verify(helpers).tokenUserEmail(BEARER_JWT_TEST);
verify(userService).mySecuritySave(userEntity);
}

Expand Down

0 comments on commit 5b5b851

Please sign in to comment.