Skip to content
Open
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
13 changes: 11 additions & 2 deletions js/src/components/ui/tags/UserAchievement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ApiUtils } from "@/lib/api/utils";
import { Image, Tooltip, Box, Text, Stack, Divider } from "@mantine/core";
import dayjs from "dayjs";
import { useMemo } from "react";
import { Link } from "react-router-dom";

type AchievementDto = Api<"AchievementDto">;
interface UserAchievementProps {
Expand Down Expand Up @@ -80,7 +81,11 @@ function GlobalTrophyBadge({ achievement }: AchievementBadgeProps) {
withArrow
position="top"
>
<Box style={{ position: "relative", display: "inline-block" }}>
<Box
style={{ position: "relative", display: "inline-block" }}
component={Link}
to={`/leaderboard/${achievement.leaderboardId}`}
>
<Text fz={34} lh={1}>
🏆
</Text>
Expand Down Expand Up @@ -124,7 +129,11 @@ function LeaderboardAchievementBadge({
withArrow
position="top"
>
<Box style={{ position: "relative", display: "inline-block" }}>
<Box
style={{ position: "relative", display: "inline-block" }}
component={Link}
to={`/leaderboard/${achievement.leaderboardId}?${achievement.leaderboard.toLowerCase()}=true`}
>
<Image
src={metadata.icon}
alt={metadata.alt}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public class Achievement {
@NotNullColumn
private String userId;

@NotNullColumn
private String leaderboardId;

@NotNullColumn
private AchievementPlaceEnum place;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public interface AchievementRepository {
* <li>title
* <li>description
* <li>isActive
* <li>leaderboardId
* </ul>
*/
void createAchievement(Achievement achievement);
Expand All @@ -29,6 +30,7 @@ public interface AchievementRepository {
* <li>description
* <li>isActive
* <li>deletedAt
* <li>leaderboardId
* </ul>
*
* @return updated achievement if successful
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class AchievementSqlRepository implements AchievementRepository {
var title = rs.getString("title");
var description = rs.getString("description");
var isActive = rs.getBoolean("isActive");
var leaderboardId = rs.getString("leaderboardId");
var createdAt = StandardizedOffsetDateTime.normalize(rs.getObject("createdAt", OffsetDateTime.class));
OffsetDateTime deletedAt =
StandardizedOffsetDateTime.normalize(rs.getObject("deletedAt", OffsetDateTime.class));
Expand All @@ -34,6 +35,7 @@ public class AchievementSqlRepository implements AchievementRepository {
.userId(userId)
.place(place)
.leaderboard(leaderboard)
.leaderboardId(leaderboardId)
.title(title)
.description(description)
.isActive(isActive)
Expand All @@ -53,9 +55,9 @@ public void createAchievement(final Achievement achievement) {
achievement.setId(UUID.randomUUID().toString());
String sql = """
INSERT INTO "Achievement"
(id, "userId", place, leaderboard, title, description, "isActive", "deletedAt")
(id, "userId", place, leaderboard, title, description, "isActive", "deletedAt", "leaderboardId")
VALUES
(:id, :userId, :place, :leaderboard, :title, :description, :isActive, :deletedAt)
(:id, :userId, :place, :leaderboard, :title, :description, :isActive, :deletedAt, :leaderboardId)
RETURNING
"createdAt"
""";
Expand All @@ -71,6 +73,7 @@ public void createAchievement(final Achievement achievement) {
.map(Enum::name)
.orElse(null),
Types.OTHER)
.param("leaderboardId", UUID.fromString(achievement.getLeaderboardId()))
.param("title", achievement.getTitle())
.param("description", achievement.getDescription())
.param("isActive", achievement.isActive())
Expand All @@ -94,7 +97,8 @@ public Achievement updateAchievement(final Achievement achievement) {
title = :title,
description = :description,
"isActive" = :isActive,
"deletedAt" = :deletedAt
"deletedAt" = :deletedAt,
"leaderboardId" = :leaderboardId
WHERE
id = :id
""";
Expand All @@ -108,6 +112,7 @@ public Achievement updateAchievement(final Achievement achievement) {
.map(Enum::name)
.orElse(null),
Types.OTHER)
.param("leaderboardId", achievement.getLeaderboardId())
.param("title", achievement.getTitle())
.param("description", achievement.getDescription())
.param("isActive", achievement.isActive())
Expand Down Expand Up @@ -150,7 +155,8 @@ public Achievement getAchievementById(final String id) {
description,
"isActive",
"createdAt",
"deletedAt"
"deletedAt",
"leaderboardId"
FROM
"Achievement"
WHERE
Expand Down Expand Up @@ -178,7 +184,8 @@ public List<Achievement> getAchievementsByUserId(final String userId) {
description,
"isActive",
"createdAt",
"deletedAt"
"deletedAt",
"leaderboardId"
FROM
"Achievement"
WHERE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ public class AchievementDto {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, nullable = true)
private Tag leaderboard;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String leaderboardId;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String title;

Expand All @@ -52,6 +55,7 @@ public static AchievementDto fromAchievement(final Achievement achievement) {
.leaderboard(achievement.getLeaderboard())
.place(achievement.getPlace())
.title(achievement.getTitle())
.leaderboardId(achievement.getLeaderboardId())
.description(achievement.getDescription())
.isActive(achievement.isActive())
.createdAt(achievement.getCreatedAt())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public class AchievementRepositoryTest extends BaseRepositoryTest {
private Achievement testAchievement;
private Achievement deletableAchievement;
private String mockUserId = "ed3bfe18-e42a-467f-b4fa-07e8da4d2555";
// Not expired leaderboard
private String mockLeaderboardId = "39bc2def-669f-4383-8ea3-7202efd613f2";

@Autowired
public AchievementRepositoryTest(final AchievementRepository repo) {
Expand All @@ -34,6 +36,7 @@ void createAchievement() {
.userId(mockUserId)
.place(AchievementPlaceEnum.ONE)
.leaderboard(null)
.leaderboardId(mockLeaderboardId)
.title("Test Achievement")
.description("Integration test achievement")
.isActive(true)
Expand Down Expand Up @@ -78,6 +81,7 @@ void testUpdateAchievement() {
.userId(testAchievement.getUserId())
.place(AchievementPlaceEnum.THREE)
.leaderboard(Tag.Patina)
.leaderboardId(mockLeaderboardId)
.title("Updated Title")
.description("Updated Description")
.isActive(false)
Expand All @@ -101,6 +105,7 @@ void testDeleteAchievementById() {
.userId(mockUserId)
.place(AchievementPlaceEnum.ONE)
.leaderboard(null)
.leaderboardId(mockLeaderboardId)
.title("Deletable Achievement")
.description("Should be deleted")
.isActive(true)
Expand Down
Loading