- Introduced enriched comment retrieval with user information and like statistics. - Implemented WebSocket notifications to notify users of new comments on content. - Updated dependency injection to include `EventsGateway` and `RealtimeModule`.
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import { Injectable } from "@nestjs/common";
|
|
import { and, desc, eq, isNull } from "drizzle-orm";
|
|
import { DatabaseService } from "../../database/database.service";
|
|
import { comments, users } from "../../database/schemas";
|
|
import type { NewCommentInDb } from "../../database/schemas/comments";
|
|
|
|
@Injectable()
|
|
export class CommentsRepository {
|
|
constructor(private readonly databaseService: DatabaseService) {}
|
|
|
|
async create(data: NewCommentInDb) {
|
|
const results = await this.databaseService.db
|
|
.insert(comments)
|
|
.values(data)
|
|
.returning();
|
|
return results[0];
|
|
}
|
|
|
|
async findAllByContentId(contentId: string) {
|
|
return this.databaseService.db
|
|
.select({
|
|
id: comments.id,
|
|
text: comments.text,
|
|
parentId: comments.parentId,
|
|
createdAt: comments.createdAt,
|
|
updatedAt: comments.updatedAt,
|
|
user: {
|
|
uuid: users.uuid,
|
|
username: users.username,
|
|
displayName: users.displayName,
|
|
avatarUrl: users.avatarUrl,
|
|
},
|
|
})
|
|
.from(comments)
|
|
.innerJoin(users, eq(comments.userId, users.uuid))
|
|
.where(and(eq(comments.contentId, contentId), isNull(comments.deletedAt)))
|
|
.orderBy(desc(comments.createdAt));
|
|
}
|
|
|
|
async findOne(id: string) {
|
|
const results = await this.databaseService.db
|
|
.select()
|
|
.from(comments)
|
|
.where(and(eq(comments.id, id), isNull(comments.deletedAt)));
|
|
return results[0];
|
|
}
|
|
|
|
async findOneEnriched(id: string) {
|
|
const results = await this.databaseService.db
|
|
.select({
|
|
id: comments.id,
|
|
text: comments.text,
|
|
parentId: comments.parentId,
|
|
createdAt: comments.createdAt,
|
|
updatedAt: comments.updatedAt,
|
|
user: {
|
|
uuid: users.uuid,
|
|
username: users.username,
|
|
displayName: users.displayName,
|
|
avatarUrl: users.avatarUrl,
|
|
},
|
|
})
|
|
.from(comments)
|
|
.innerJoin(users, eq(comments.userId, users.uuid))
|
|
.where(and(eq(comments.id, id), isNull(comments.deletedAt)));
|
|
return results[0];
|
|
}
|
|
|
|
async delete(id: string) {
|
|
await this.databaseService.db
|
|
.update(comments)
|
|
.set({ deletedAt: new Date() })
|
|
.where(eq(comments.id, id));
|
|
}
|
|
}
|