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 @@ -13,7 +13,7 @@
@RequiredArgsConstructor
@RequestMapping("/api/v1/shorten")
@PreAuthorize("hasRole('USER')")
class UrlController {
final class UrlController {

private final UrlService urlService;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/users")
class UserController {
final class UserController {

private final UserService userService;

Expand Down
30 changes: 2 additions & 28 deletions src/main/java/com/kubuski/urlshortener/entity/User.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
package com.kubuski.urlshortener.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import java.util.Collection;
import java.util.List;

Expand Down Expand Up @@ -46,24 +40,4 @@ public class User implements UserDetails {
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority(this.role.name()));
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/kubuski/urlshortener/job/UrlCleanupJob.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
Expand All @@ -19,6 +20,7 @@ public class UrlCleanupJob extends QuartzJobBean {
private final UrlRepository urlRepository;

@Override
@Transactional
protected void executeInternal(final JobExecutionContext context) {
Instant cutoffDate = calculateCutoffDate();
List<Url> urlsToDelete = findUrlsToDelete(cutoffDate);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,11 @@
import com.kubuski.urlshortener.entity.Url;
import com.kubuski.urlshortener.entity.User;

/**
* Utility class for mapping between entities and DTOs.
* Centralizes conversion logic to reduce code duplication.
*/
public final class EntityMapper {
public final class UserMapper {

private EntityMapper() {
// Utility class, prevent instantiation
private UserMapper() {
}

/**
* Converts a User entity to UserResponse DTO.
*
* @param user the User entity
* @return UserResponse DTO
*/
public static UserResponse toUserResponse(User user) {
return new UserResponse(
user.getId(),
Expand All @@ -30,12 +19,6 @@ public static UserResponse toUserResponse(User user) {
);
}

/**
* Converts a Url entity to UrlResponse DTO.
*
* @param url the Url entity
* @return UrlResponse DTO
*/
public static UrlResponse toUrlResponse(Url url) {
return new UrlResponse(
url.getId(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public AuthenticationResponse register(RegisterRequest request) {
return new AuthenticationResponse(jwtToken);
}

@Transactional
public AuthenticationResponse authenticate(AuthenticationRequest request) {
authenticateUser(request);
User user = findUserByLogin(request.login());
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/kubuski/urlshortener/service/UrlService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.kubuski.urlshortener.dto.UrlResponse;
import com.kubuski.urlshortener.entity.Url;
import com.kubuski.urlshortener.exception.UrlNotFoundException;
import com.kubuski.urlshortener.mapper.EntityMapper;
import com.kubuski.urlshortener.mapper.UserMapper;
import com.kubuski.urlshortener.repository.UrlRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -23,23 +23,23 @@ public UrlResponse createShortUrl(UrlRequest urlRequest) {
Url url = buildUrl(urlRequest);
Url savedUrl = urlRepository.save(url);

return EntityMapper.toUrlResponse(savedUrl);
return UserMapper.toUrlResponse(savedUrl);
}

@Transactional
public UrlResponse getOriginalUrl(String shortUrl) {
Url url = findUrlByShortUrl(shortUrl);
incrementAccessCount(url);

return EntityMapper.toUrlResponse(url);
return UserMapper.toUrlResponse(url);
}

@Transactional
public UrlResponse updateOriginalUrl(String shortUrl, UrlRequest urlRequest) {
Url url = findUrlByShortUrl(shortUrl);
updateUrl(url, urlRequest);

return EntityMapper.toUrlResponse(url);
return UserMapper.toUrlResponse(url);
}

@Transactional
Expand All @@ -52,7 +52,7 @@ public void deleteUrl(String shortUrl) {
public UrlResponse getUrlStats(String shortUrl) {
Url url = findUrlByShortUrl(shortUrl);

return EntityMapper.toUrlResponse(url);
return UserMapper.toUrlResponse(url);
}

private Url buildUrl(UrlRequest urlRequest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.kubuski.urlshortener.dto.UserResponse;
import com.kubuski.urlshortener.entity.User;
import com.kubuski.urlshortener.exception.UserNotFoundException;
import com.kubuski.urlshortener.mapper.EntityMapper;
import com.kubuski.urlshortener.mapper.UserMapper;
import com.kubuski.urlshortener.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
Expand All @@ -23,15 +23,16 @@ public UserResponse findByEmail(String email) {
User user = userRepository.findByEmail(email).orElseThrow(
() -> new UserNotFoundException("User " + email + " not found in Database"));

return EntityMapper.toUserResponse(user);
return UserMapper.toUserResponse(user);
}

@Transactional
public UserResponse registerUser(UserRequest userRequest) {
User user = toUser(userRequest);
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);

return EntityMapper.toUserResponse(user);
return UserMapper.toUserResponse(user);
}

private User toUser(UserRequest userRequest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@

import java.time.Instant;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;

/**
* Test class for EntityMapper utility.
Expand All @@ -26,7 +27,7 @@ public void testToUserResponse() {
.password("hashedPassword")
.build();

UserResponse response = EntityMapper.toUserResponse(user);
UserResponse response = UserMapper.toUserResponse(user);

assertAll(
() -> assertEquals(user.getId(), response.id()),
Expand All @@ -50,7 +51,7 @@ public void testToUrlResponse() {
.deleted(false)
.build();

UrlResponse response = EntityMapper.toUrlResponse(url);
UrlResponse response = UserMapper.toUrlResponse(url);

assertAll(
() -> assertEquals(url.getId(), response.id()),
Expand Down
Loading