Skip to content

Commit a89f382

Browse files
committed
Implement tag management functionality by adding Tag model and repository. Update persistence layer to use DatabaseTableName constants for consistency. Refactor Page component to fetch and display tags asynchronously.
1 parent bd240d6 commit a89f382

File tree

7 files changed

+63
-15
lines changed

7 files changed

+63
-15
lines changed

src/app/test/page.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
"use client";
2-
1+
import { getTags } from "@/backend/services/tag.action";
32
import React from "react";
43

5-
const Page = () => {
6-
const [tags, setTags] = React.useState<string[]>([]);
7-
return <div className="p-10"></div>;
4+
const Page = async () => {
5+
const tags = await getTags({ page: 1, limit: -1 });
6+
return <pre className="p-10">{JSON.stringify(tags, null, 2)}</pre>;
87
};
98

109
export default Page;

src/backend/models/domain-models.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,13 @@ export interface SeriesItem {
9090
created_at: Date;
9191
updated_at: Date;
9292
}
93+
94+
export interface Tag {
95+
id: string;
96+
name: string;
97+
icon?: IServerFile | null;
98+
color?: string | null;
99+
description?: string | null;
100+
created_at: Date;
101+
updated_at: Date;
102+
}

src/backend/persistence-repositories.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,43 @@ import {
22
Article,
33
Series,
44
SeriesItem,
5+
Tag,
56
User,
67
UserSession,
78
UserSocial,
89
} from "./models/domain-models";
910
import { pgClient } from "./persistence/database-drivers/pg.client";
11+
import { DatabaseTableName } from "./persistence/persistence-contracts";
1012
import { PersistentRepository } from "./persistence/persistence.repository";
1113

12-
export const userRepository = new PersistentRepository<User>("users", pgClient);
14+
export const userRepository = new PersistentRepository<User>(
15+
DatabaseTableName.users,
16+
pgClient
17+
);
1318
export const articleRepository = new PersistentRepository<Article>(
14-
"articles",
19+
DatabaseTableName.articles,
20+
pgClient
21+
);
22+
export const tagRepository = new PersistentRepository<Tag>(
23+
DatabaseTableName.tags,
1524
pgClient
1625
);
17-
1826
export const userSocialRepository = new PersistentRepository<UserSocial>(
19-
"user_socials",
27+
DatabaseTableName.user_socials,
2028
pgClient
2129
);
2230
export const userSessionRepository = new PersistentRepository<UserSession>(
23-
"user_sessions",
31+
DatabaseTableName.user_sessions,
2432
pgClient
2533
);
2634

27-
const seriesRepository = new PersistentRepository<Series>("series", pgClient);
35+
const seriesRepository = new PersistentRepository<Series>(
36+
DatabaseTableName.series,
37+
pgClient
38+
);
2839

2940
const seriesItemsRepository = new PersistentRepository<SeriesItem>(
30-
"series_items",
41+
DatabaseTableName.series_items,
3142
pgClient
3243
);
3344

@@ -36,6 +47,7 @@ export const persistenceRepository = {
3647
userSocial: userSocialRepository,
3748
userSession: userSessionRepository,
3849
article: articleRepository,
50+
tags: tagRepository,
3951
series: seriesRepository,
4052
seriesItems: seriesItemsRepository,
4153
};

src/backend/persistence/persistence-contracts.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,10 @@ export enum DatabaseTableName {
109109
clients = "clients",
110110
users = "users",
111111
roles = "roles",
112+
articles = "articles",
113+
user_socials = "user_socials",
114+
user_sessions = "user_sessions",
115+
series = "series",
116+
series_items = "series_items",
117+
tags = "tags",
112118
}

src/backend/persistence/persistence.repository.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { log } from "console";
22
import {
33
AppPaginationResponseDto,
4+
DatabaseTableName,
45
IPagination,
56
IPersistentDriver,
67
IPersistentPaginationPayload,
@@ -18,7 +19,7 @@ import { removeNullOrUndefinedFromObject } from "@/lib/utils";
1819

1920
export class PersistentRepository<DOMAIN_MODEL_TYPE> {
2021
constructor(
21-
public readonly tableName: string,
22+
public readonly tableName: DatabaseTableName,
2223
public readonly persistentDriver: IPersistentDriver
2324
) {}
2425

@@ -51,7 +52,7 @@ export class PersistentRepository<DOMAIN_MODEL_TYPE> {
5152
totalCount: +totalCountResult,
5253
currentPage: +_page,
5354
hasNextPage: _page * _limit < totalCountResult,
54-
totalPages: +Math.ceil(totalCountResult / _limit),
55+
totalPages: _limit == -1 ? 1 : +Math.ceil(totalCountResult / _limit),
5556
},
5657
};
5758
}

src/backend/services/article.actions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ import {
2121
} from "./RepositoryException";
2222
import { ArticleRepositoryInput } from "./inputs/article.input";
2323
import { getSessionUserId } from "./session.actions";
24+
import { DatabaseTableName } from "../persistence/persistence-contracts";
2425

2526
const articleRepository = new PersistentRepository<Article>(
26-
"articles",
27+
DatabaseTableName.articles,
2728
pgClient
2829
);
2930

src/backend/services/tag.action.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1+
"use server";
12

3+
import { z } from "zod";
4+
import { persistenceRepository } from "../persistence-repositories";
5+
import { TagRepositoryInput } from "./inputs/tag.input";
6+
import { handleRepositoryException } from "./RepositoryException";
7+
8+
export const getTags = async (
9+
_input: z.infer<typeof TagRepositoryInput.findAllInput>
10+
) => {
11+
try {
12+
const input = await TagRepositoryInput.findAllInput.parseAsync(_input);
13+
return persistenceRepository.tags.findAllWithPagination({
14+
page: input.page,
15+
limit: input.limit,
16+
});
17+
} catch (error) {
18+
handleRepositoryException(error);
19+
}
20+
};

0 commit comments

Comments
 (0)