Skip to content
Merged

Dev #58

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
f112c72
Merge pull request #7 from mategames-team/add-dockerfile
Bondaliname Dec 11, 2025
8c2e7e5
configured actuator (#8)
YuliiaNisha Dec 11, 2025
f4d4374
Improve filtering (#9)
YuliiaNisha Dec 13, 2025
389d612
Add user registration login (#11)
YuliiaNisha Dec 13, 2025
65af954
fetched description
YuliiaNisha Dec 13, 2025
4f58c5d
Merge pull request #12 from mategames-team/fetch-game-description
YuliiaNisha Dec 13, 2025
87eb0df
Merge pull request #13 from mategames-team/add-game-lists-to-user
YuliiaNisha Dec 16, 2025
55cc874
Improve fetch best games (#14)
YuliiaNisha Dec 16, 2025
e8d1baa
created user info update and get (#15)
YuliiaNisha Dec 16, 2025
151a67b
Refactor get by api id method (#16)
YuliiaNisha Dec 17, 2025
5547ad5
Create get all games from api endpoint (#17)
YuliiaNisha Dec 18, 2025
981e8ff
Configure comments (#18)
YuliiaNisha Dec 19, 2025
6a45e62
refactored comments (#19)
YuliiaNisha Dec 19, 2025
7ea45da
added status to response (#20)
YuliiaNisha Dec 19, 2025
9559498
created search in api endpoint (#21)
YuliiaNisha Dec 20, 2025
7d0e69e
Create get user comments (#22)
YuliiaNisha Dec 21, 2025
4989e6b
Update Dockerfile for dev environment
Bondaliname Dec 21, 2025
9b06e83
added swagger (#23)
YuliiaNisha Dec 21, 2025
afeb5d9
refactored security and health (#24)
YuliiaNisha Dec 22, 2025
ab2c777
Refactor db update (#25)
YuliiaNisha Dec 23, 2025
c7a1f6f
allowed any authenticated user se userinfo (#26)
YuliiaNisha Dec 23, 2025
b2c465c
configured setting user role during registration (#27)
YuliiaNisha Dec 24, 2025
b591c12
created service tests (#28)
YuliiaNisha Dec 27, 2025
e2eb0ec
made method return gameDto (#29)
YuliiaNisha Dec 27, 2025
13695a4
configured cors (#30)
YuliiaNisha Dec 28, 2025
f0bf62c
added preconditions to yamls (#31)
YuliiaNisha Dec 28, 2025
03d2282
added patch method to cors (#32)
YuliiaNisha Dec 29, 2025
e674437
added response code (#33)
YuliiaNisha Dec 29, 2025
c039b0c
retun user info depending on param, return user id when login (#34)
YuliiaNisha Dec 30, 2025
4252725
updated readme, removed unused (#35)
YuliiaNisha Jan 3, 2026
146a200
merged main to dev
YuliiaNisha Jan 4, 2026
efb0d61
added info about userGames and changed max value of rating to 10 (#37)
YuliiaNisha Jan 4, 2026
4a0365a
Merge branch 'main' into dev
YuliiaNisha Jan 4, 2026
3a4d606
added ci file (#39)
YuliiaNisha Jan 4, 2026
6ab2dfd
added profileName and gameName to commentDto (#40)
YuliiaNisha Jan 4, 2026
91eb275
webhook after ci (#44)
Bondaliname Jan 5, 2026
ac19eac
Update public endpoints (#46)
YuliiaNisha Jan 7, 2026
d37ee7d
Merge branch 'main' into dev
YuliiaNisha Jan 7, 2026
de8e901
refactored delete method (#48)
YuliiaNisha Jan 10, 2026
724f9c3
made filtering games by several years (#49)
YuliiaNisha Jan 11, 2026
690e57e
Merge branch 'main' into dev
YuliiaNisha Jan 11, 2026
e211d8d
allowed rating to be up to 10 (#51)
YuliiaNisha Jan 19, 2026
05ebf88
added regex to validate (#53)
YuliiaNisha Jan 20, 2026
0788d61
Add developer info to game (#55)
YuliiaNisha Jan 22, 2026
d87a8f3
removed email from update method (#56)
YuliiaNisha Jan 22, 2026
93715e9
return token after registartion (#57)
YuliiaNisha Jan 22, 2026
a0f4de6
Merge branch 'main' into dev
YuliiaNisha Jan 22, 2026
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 @@ -3,6 +3,7 @@
import com.videogamescatalogue.backend.dto.internal.user.UserLoginRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserLoginResponseDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationResponseDto;
import com.videogamescatalogue.backend.dto.internal.user.UserResponseDto;
import com.videogamescatalogue.backend.security.AuthenticationService;
import com.videogamescatalogue.backend.service.user.UserService;
Expand Down Expand Up @@ -45,7 +46,7 @@ public class AuthenticationController {
}
)
@PostMapping("/registration")
UserResponseDto registerUser(
UserRegistrationResponseDto registerUser(
@RequestBody @Valid UserRegistrationRequestDto requestDto
) {
return userService.registerUser(requestDto);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.videogamescatalogue.backend.dto.external;

public record ApiResponseDeveloperDto(
Long id,
String name
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public record ApiResponseFullGameDto(

List<ApiResponseGenreDto> genres,

List<ApiResponseDeveloperDto> developers,

BigDecimal rating
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.videogamescatalogue.backend.dto.internal.developer;

public record DeveloperDto(
Long id,
Long apiId,
String name
) {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.videogamescatalogue.backend.dto.internal.game;

import com.videogamescatalogue.backend.dto.internal.developer.DeveloperDto;
import com.videogamescatalogue.backend.dto.internal.genre.GenreDto;
import com.videogamescatalogue.backend.dto.internal.platform.PlatformDto;
import java.math.BigDecimal;
Expand All @@ -12,6 +13,7 @@ public record GameDto(
String backgroundImage,
Set<PlatformDto> platforms,
Set<GenreDto> genres,
Set<DeveloperDto> developers,
BigDecimal apiRating,
String description
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.videogamescatalogue.backend.dto.internal.game;

import com.videogamescatalogue.backend.dto.internal.developer.DeveloperDto;
import com.videogamescatalogue.backend.dto.internal.genre.GenreDto;
import com.videogamescatalogue.backend.dto.internal.platform.PlatformDto;
import com.videogamescatalogue.backend.model.UserGame;
Expand All @@ -13,6 +14,7 @@ public record GameWithStatusDto(
String backgroundImage,
Set<PlatformDto> platforms,
Set<GenreDto> genres,
Set<DeveloperDto> developers,
BigDecimal apiRating,
String description,
UserGame.GameStatus status
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package com.videogamescatalogue.backend.dto.internal.user;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Size;

public record UpdateUserRequestDto(
String profileName,
@Email(message = "Invalid format of email.")
String email,
@Size(max = 5000, message = "About user info must be less than 5000 digits")
String about,
@Size(max = 50, message = "Location info must be less than 50 digits")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.videogamescatalogue.backend.dto.internal.user;

public record UserRegistrationResponseDto(
Long id,
String profileName,
String about,
String location,
String token
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.videogamescatalogue.backend.mapper.developer;

import com.videogamescatalogue.backend.config.MapperConfig;
import com.videogamescatalogue.backend.dto.external.ApiResponseDeveloperDto;
import com.videogamescatalogue.backend.dto.internal.developer.DeveloperDto;
import com.videogamescatalogue.backend.model.Developer;
import java.util.List;
import java.util.Set;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper(config = MapperConfig.class)
public interface DeveloperMapper {
@Mapping(source = "id", target = "apiId")
@Mapping(target = "id", ignore = true)
Developer toModel(ApiResponseDeveloperDto apiResponseDeveloperDto);

Set<Developer> toModelSet(List<ApiResponseDeveloperDto> developers);

Set<DeveloperDto> toDtoSet(Set<Developer> developers);

DeveloperDto toDto(Developer developer);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.videogamescatalogue.backend.mapper.developer;

import com.videogamescatalogue.backend.dto.external.ApiResponseDeveloperDto;
import com.videogamescatalogue.backend.dto.internal.developer.DeveloperDto;
import com.videogamescatalogue.backend.model.Developer;
import com.videogamescatalogue.backend.repository.DeveloperRepository;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.mapstruct.Named;
import org.springframework.stereotype.Component;

@RequiredArgsConstructor
@Component
public class DeveloperProvider {
private final DeveloperMapper developerMapper;
private final DeveloperRepository developerRepository;

@Named("toDevelopersSet")
public Set<Developer> toDevelopersSet(List<ApiResponseDeveloperDto> developers) {
List<Long> developerApiIds = developers.stream()
.map(ApiResponseDeveloperDto::id)
.toList();

List<Developer> existingDevelopers = developerRepository.findAllByApiIdIn(developerApiIds);

Map<Long, Developer> existingDevelopersMap = existingDevelopers.stream()
.collect(Collectors.toMap(
Developer::getApiId,
d -> d
));

Set<Developer> developersSet = developers.stream()
.map(d -> existingDevelopersMap.getOrDefault(
d.id(),
developerMapper.toModel(d)))
.collect(Collectors.toSet());

return developersSet;
}

@Named("toDeveloperDtosSet")
public Set<DeveloperDto> toDeveloperDtosSet(Set<Developer> developers) {
return developerMapper.toDtoSet(developers);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.videogamescatalogue.backend.dto.internal.game.GameDto;
import com.videogamescatalogue.backend.dto.internal.game.GameWithStatusDto;
import com.videogamescatalogue.backend.exception.ParsingException;
import com.videogamescatalogue.backend.mapper.developer.DeveloperProvider;
import com.videogamescatalogue.backend.mapper.genre.GenreProvider;
import com.videogamescatalogue.backend.mapper.platform.PlatformProvider;
import com.videogamescatalogue.backend.model.Game;
Expand All @@ -17,7 +18,11 @@
import org.mapstruct.Mapping;
import org.mapstruct.Named;

@Mapper(config = MapperConfig.class, uses = {PlatformProvider.class, GenreProvider.class})
@Mapper(config = MapperConfig.class, uses = {
PlatformProvider.class,
GenreProvider.class,
DeveloperProvider.class
})
public interface GameMapper {
List<Game> toModelList(List<ApiResponseGameDto> games);

Expand All @@ -34,14 +39,20 @@ public interface GameMapper {
@Mapping(source = "released", target = "year", qualifiedByName = "toYear")
@Mapping(source = "platforms", target = "platforms", qualifiedByName = "toPlatformsSet")
@Mapping(source = "genres", target = "genres", qualifiedByName = "toGenresSet")
@Mapping(source = "developers", target = "developers", qualifiedByName = "toDevelopersSet")
@Mapping(source = "rating", target = "apiRating")
Game toModel(ApiResponseFullGameDto apiResponseGameDto);

@Mapping(source = "platforms", target = "platforms", qualifiedByName = "toPlatformDtosSet")
@Mapping(source = "genres", target = "genres", qualifiedByName = "toGenreDtosSet")
@Mapping(source = "developers", target = "developers", qualifiedByName = "toDeveloperDtosSet")
GameDto toDto(Game game);

@Mapping(target = "status", source = "status")
@Mapping(
source = "game.developers", target = "developers",
qualifiedByName = "toDeveloperDtosSet"
)
GameWithStatusDto toDtoWithStatus(Game game, UserGame.GameStatus status);

@Named("toYear")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.videogamescatalogue.backend.config.MapperConfig;
import com.videogamescatalogue.backend.dto.internal.user.UpdateUserRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationResponseDto;
import com.videogamescatalogue.backend.dto.internal.user.UserResponseDto;
import com.videogamescatalogue.backend.model.User;
import org.mapstruct.Mapper;
Expand All @@ -17,5 +18,8 @@ public interface UserMapper {
@Mapping(source = "id", target = "userGames", qualifiedByName = "getStatusDtoList")
UserResponseDto toDto(User user);

@Mapping(source = "token", target = "token")
UserRegistrationResponseDto toRegistrationResponseDto(User user, String token);

User updateProfileInfo(@MappingTarget User user, UpdateUserRequestDto requestDto);
}
26 changes: 26 additions & 0 deletions src/main/java/com/videogamescatalogue/backend/model/Developer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.videogamescatalogue.backend.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "developers")
@Getter
@Setter
public class Developer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private Long apiId;

@Column(nullable = false)
private String name;
}
9 changes: 9 additions & 0 deletions src/main/java/com/videogamescatalogue/backend/model/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ public class Game {
)
private Set<Genre> genres = new HashSet<>();

@ManyToMany
@JoinTable(
name = "games_developers",
joinColumns = @JoinColumn(name = "game_id"),
inverseJoinColumns = @JoinColumn(name = "developer_id"),
uniqueConstraints = @UniqueConstraint(columnNames = {"game_id", "developer_id"})
)
private Set<Developer> developers = new HashSet<>();

private BigDecimal apiRating;

private String description;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.videogamescatalogue.backend.repository;

import com.videogamescatalogue.backend.model.Developer;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DeveloperRepository extends JpaRepository<Developer, Long> {
Optional<Developer> findByApiId(Long apiId);

List<Developer> findAllByApiIdIn(List<Long> apiIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,23 @@
import com.videogamescatalogue.backend.dto.internal.GameSearchParameters;
import com.videogamescatalogue.backend.dto.internal.game.GameDto;
import com.videogamescatalogue.backend.dto.internal.game.GameWithStatusDto;
import com.videogamescatalogue.backend.mapper.developer.DeveloperMapper;
import com.videogamescatalogue.backend.mapper.game.GameMapper;
import com.videogamescatalogue.backend.model.Developer;
import com.videogamescatalogue.backend.model.Game;
import com.videogamescatalogue.backend.model.User;
import com.videogamescatalogue.backend.model.UserGame;
import com.videogamescatalogue.backend.repository.DeveloperRepository;
import com.videogamescatalogue.backend.repository.GameRepository;
import com.videogamescatalogue.backend.repository.SpecificationBuilder;
import com.videogamescatalogue.backend.repository.UserGameRepository;
import com.videogamescatalogue.backend.service.RawgApiClient;
import jakarta.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
Expand All @@ -32,9 +37,11 @@
public class GameServiceImpl implements GameService {
private final RawgApiClient apiClient;
private final GameMapper gameMapper;
private final DeveloperMapper developerMapper;
private final GameRepository gameRepository;
private final SpecificationBuilder<Game, GameSearchParameters> specificationBuilder;
private final UserGameRepository userGameRepository;
private final DeveloperRepository developerRepository;

@Override
public void fetchBestGames() {
Expand Down Expand Up @@ -82,6 +89,7 @@ public Page<GameDto> getAllGamesFromDb(Pageable pageable) {
.map(gameMapper::toDto);
}

@Transactional
@Override
public GameWithStatusDto getByApiId(Long apiId, User user) {
Game game = findOrUpdate(apiId);
Expand Down Expand Up @@ -154,15 +162,26 @@ private Game findOrUpdate(Long apiId) {
}
Game game = gameOptional.get();
if (game.getDescription() == null) {
return updateGameDescription(apiId, game);
updateGameDescription(apiId, game);
}
if (game.getDevelopers().isEmpty()) {
updateGameDevelopers(apiId, game);
}
return game;
}

private Game updateGameDescription(Long apiId, Game game) {
private void updateGameDescription(Long apiId, Game game) {
ApiResponseFullGameDto apiGame = apiClient.getGameById(apiId);
game.setDescription(apiGame.description());
return gameRepository.save(game);
gameRepository.save(game);
}

private void updateGameDevelopers(Long apiId, Game game) {
ApiResponseFullGameDto apiGame = apiClient.getGameById(apiId);
Set<Developer> developers = developerMapper.toModelSet(apiGame.developers());
developerRepository.saveAll(developers);
game.setDevelopers(developers);
gameRepository.save(game);
}

private Game findFromApi(Long apiId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
import com.videogamescatalogue.backend.dto.internal.user.ChangePasswordRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UpdateUserRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationRequestDto;
import com.videogamescatalogue.backend.dto.internal.user.UserRegistrationResponseDto;
import com.videogamescatalogue.backend.dto.internal.user.UserResponseDto;
import com.videogamescatalogue.backend.model.User;

public interface UserService {
UserResponseDto registerUser(
UserRegistrationResponseDto registerUser(
UserRegistrationRequestDto requestDto
);

Expand Down
Loading