Skip to content

Commit d403393

Browse files
committed
Refactor persistence layer: update schema paths, replace deprecated repositories with new persistenceRepository methods, and enhance database connection management.
1 parent 979efde commit d403393

File tree

16 files changed

+110
-127
lines changed

16 files changed

+110
-127
lines changed

.idea/prettier.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

drizzle.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ dotenv.config({
99

1010
export default defineConfig({
1111
out: "./migrations",
12-
schema: "./src/backend/schemas/schemas.ts",
12+
schema: "./src/backend/persistence/schema.ts",
1313
dialect: "postgresql",
1414
dbCredentials: {
1515
url: process.env.DATABASE_URL!,

src/app/(dashboard-editor)/dashboard/articles/[uuid]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const page: React.FC<Props> = async ({ params }) => {
3232
],
3333
});
3434

35-
const aggregatedTags = await persistenceRepository.articleTag.find({
35+
const aggregatedTags = await persistenceRepository.articleTagPivot.find({
3636
where: inArray("article_id", [article.id]),
3737
joins: [
3838
{

src/app/api/play/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function GET(request: Request) {
1515
// }
1616
// ]
1717
return NextResponse.json({
18-
handle: await persistenceRepository.articleTag.delete({
18+
handle: await persistenceRepository.articleTagPivot.delete({
1919
where: {
2020
AND: [
2121
{

src/backend/persistence/clients.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
11
import "dotenv/config";
2+
import { PostgresAdapter } from "sqlkit";
23
import { drizzle } from "drizzle-orm/node-postgres";
3-
import * as schema from "../schemas/schemas";
4-
export const db = drizzle(process.env.DATABASE_URL!, { schema });
4+
import * as schema from "./schemas";
5+
import { Pool } from "pg";
6+
import { env } from "@/env";
7+
8+
declare global {
9+
var pgClient: PostgresAdapter | undefined;
10+
}
11+
12+
export const drizzleClient = drizzle(process.env.DATABASE_URL!, { schema });
13+
14+
// Initialize global database connection
15+
if (!globalThis.pgClient) {
16+
const pool = new Pool({
17+
connectionString: env.DATABASE_URL,
18+
});
19+
20+
globalThis.pgClient = new PostgresAdapter(pool);
21+
}
22+
23+
export const pgClient = globalThis.pgClient;

src/backend/persistence/persistence-contracts.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
export enum DatabaseTableName {
2-
tenants = "tenants",
3-
clients = "clients",
42
users = "users",
5-
roles = "roles",
63
articles = "articles",
74
user_socials = "user_socials",
85
user_sessions = "user_sessions",

src/backend/persistence/persistence-repositories.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,62 @@ import {
99
UserSession,
1010
UserSocial,
1111
} from "../models/domain-models";
12-
import { pgClient } from "./database-drivers/pg.client";
12+
import { pgClient } from "./clients";
1313
import { DatabaseTableName } from "./persistence-contracts";
1414

15+
const repositoryConfig = {
16+
logging: true,
17+
};
18+
1519
export const userRepository = new Repository<User>(
1620
DatabaseTableName.users,
17-
pgClient
21+
pgClient,
22+
repositoryConfig,
1823
);
1924
export const articleRepository = new Repository<Article>(
2025
DatabaseTableName.articles,
21-
pgClient
26+
pgClient,
27+
repositoryConfig,
2228
);
2329
export const tagRepository = new Repository<Tag>(
2430
DatabaseTableName.tags,
25-
pgClient
31+
pgClient,
32+
repositoryConfig,
2633
);
2734
export const articleTagRepository = new Repository<ArticleTag>(
2835
DatabaseTableName.article_tag,
29-
pgClient
36+
pgClient,
37+
repositoryConfig,
3038
);
3139
export const userSocialRepository = new Repository<UserSocial>(
3240
DatabaseTableName.user_socials,
33-
pgClient
41+
pgClient,
42+
repositoryConfig,
3443
);
3544
export const userSessionRepository = new Repository<UserSession>(
3645
DatabaseTableName.user_sessions,
37-
pgClient
46+
pgClient,
47+
repositoryConfig,
3848
);
3949

4050
const seriesRepository = new Repository<Series>(
4151
DatabaseTableName.series,
42-
pgClient
52+
pgClient,
53+
repositoryConfig,
4354
);
4455

4556
const seriesItemsRepository = new Repository<SeriesItem>(
4657
DatabaseTableName.series_items,
47-
pgClient
58+
pgClient,
59+
repositoryConfig,
4860
);
4961

5062
export const persistenceRepository = {
5163
user: userRepository,
5264
userSocial: userSocialRepository,
5365
userSession: userSessionRepository,
5466
article: articleRepository,
55-
articleTag: articleTagRepository,
67+
articleTagPivot: articleTagRepository,
5668
tags: tagRepository,
5769
series: seriesRepository,
5870
seriesItems: seriesItemsRepository,

src/backend/services/article.actions.ts

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,15 @@ import * as sk from "sqlkit";
99
import { and, desc, eq, like, neq, or } from "sqlkit";
1010
import { z } from "zod";
1111
import { Article, User } from "../models/domain-models";
12-
import { pgClient } from "../persistence/database-drivers/pg.client";
1312
import { DatabaseTableName } from "../persistence/persistence-contracts";
13+
import { persistenceRepository } from "../persistence/persistence-repositories";
1414
import {
1515
handleRepositoryException,
1616
RepositoryException,
1717
} from "./RepositoryException";
1818
import { ArticleRepositoryInput } from "./inputs/article.input";
1919
import { getSessionUserId } from "./session.actions";
2020
import { syncTagsWithArticles } from "./tag.action";
21-
import { persistenceRepository } from "../persistence/persistence-repositories";
22-
23-
/**
24-
* Creates a new article in the database.
25-
*
26-
* @param _input - The article data to create, validated against ArticleRepositoryInput.createArticleInput schema
27-
* @returns Promise<Article> - The newly created article
28-
* @throws {RepositoryException} If article creation fails or validation fails
29-
*/
30-
export async function createArticle(
31-
_input: z.infer<typeof ArticleRepositoryInput.createArticleInput>
32-
) {
33-
try {
34-
const input =
35-
await ArticleRepositoryInput.createArticleInput.parseAsync(_input);
36-
const article = await persistenceRepository.article.insert([
37-
{
38-
title: input.title,
39-
handle: input.handle,
40-
excerpt: input.excerpt ?? null,
41-
body: input.body ?? null,
42-
cover_image: input.cover_image ?? null,
43-
is_published: input.is_published ?? false,
44-
published_at: input.is_published ? new Date() : null,
45-
author_id: input.author_id,
46-
},
47-
]);
48-
return article;
49-
} catch (error) {
50-
handleRepositoryException(error);
51-
}
52-
}
5321

5422
export async function createMyArticle(
5523
_input: z.infer<typeof ArticleRepositoryInput.createMyArticleInput>

src/backend/services/dashboard.action.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
"use server";
22

33
import * as sessionActions from "@/backend/services/session.actions";
4-
import { persistenceRepository } from "../persistence/persistence-repositories";
4+
import { pgClient } from "@/backend/persistence/clients";
55

66
const sql = String.raw;
77

88
const query = sql`
99
SELECT (SELECT Count(*)
10-
FROM articles
11-
WHERE author_id = $1)
12-
AS total_articles,
13-
(SELECT Count(*)
14-
FROM comments
15-
WHERE comments.commentable_type = 'ARTICLE'
16-
AND comments.commentable_id IN (SELECT id
17-
FROM articles
18-
WHERE articles.author_id = $1))
19-
AS total_comments
10+
FROM articles
11+
WHERE author_id = $1)
12+
AS total_articles,
13+
(SELECT Count(*)
14+
FROM comments
15+
WHERE comments.commentable_type = 'ARTICLE'
16+
AND comments.commentable_id IN (SELECT id
17+
FROM articles
18+
WHERE articles.author_id = $1))
19+
AS total_comments
2020
`;
2121

2222
export async function myArticleMatrix() {

src/backend/services/inputs/article.input.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export const ArticleRepositoryInput = {
6363
})
6464
.optional(),
6565

66-
// Optional boolean flag for publish status
66+
// Optional boolean flag for publication status
6767
is_published: z.boolean().optional(),
6868

6969
tag_ids: z.array(z.string()).optional().nullable(),

0 commit comments

Comments
 (0)