feat: add repo funcs
This commit is contained in:
@@ -420,6 +420,7 @@ export const getWithListAndMembersByPublicId = async (
|
||||
) => {
|
||||
const card = await db.query.cards.findFirst({
|
||||
columns: {
|
||||
id: true,
|
||||
publicId: true,
|
||||
title: true,
|
||||
description: true,
|
||||
|
||||
@@ -63,6 +63,36 @@ export const getById = async (db: dbClient, memberId: number) => {
|
||||
});
|
||||
};
|
||||
|
||||
export const getByPublicIdsWithUsers = async (
|
||||
db: dbClient,
|
||||
memberPublicIds: string[],
|
||||
workspaceId?: number,
|
||||
) => {
|
||||
return db.query.workspaceMembers.findMany({
|
||||
where: (members, { inArray: inArrayFn, eq, and, isNull: isNullFn }) => {
|
||||
const conditions = [inArrayFn(members.publicId, memberPublicIds)];
|
||||
|
||||
if (workspaceId) {
|
||||
conditions.push(eq(members.workspaceId, workspaceId));
|
||||
}
|
||||
|
||||
conditions.push(eq(members.status, "active"));
|
||||
conditions.push(isNullFn(members.deletedAt));
|
||||
|
||||
return and(...conditions);
|
||||
},
|
||||
with: {
|
||||
user: {
|
||||
columns: {
|
||||
id: true,
|
||||
name: true,
|
||||
email: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const getByEmailAndStatus = async (
|
||||
db: dbClient,
|
||||
email: string,
|
||||
|
||||
98
packages/db/src/repository/notification.repo.ts
Normal file
98
packages/db/src/repository/notification.repo.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import { and, count, eq, isNull } from "drizzle-orm";
|
||||
|
||||
import type { dbClient } from "@kan/db/client";
|
||||
import type { NotificationType } from "@kan/db/schema";
|
||||
import { notifications } from "@kan/db/schema";
|
||||
import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
export const create = async (
|
||||
db: dbClient,
|
||||
notificationInput: {
|
||||
type: NotificationType;
|
||||
userId: string;
|
||||
cardId?: number;
|
||||
commentId?: number;
|
||||
workspaceId?: number;
|
||||
metadata?: string;
|
||||
},
|
||||
) => {
|
||||
const [result] = await db
|
||||
.insert(notifications)
|
||||
.values({
|
||||
publicId: generateUID(),
|
||||
type: notificationInput.type,
|
||||
userId: notificationInput.userId,
|
||||
cardId: notificationInput.cardId,
|
||||
commentId: notificationInput.commentId,
|
||||
workspaceId: notificationInput.workspaceId,
|
||||
metadata: notificationInput.metadata,
|
||||
})
|
||||
.returning();
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
export const exists = async (
|
||||
db: dbClient,
|
||||
args: {
|
||||
userId: string;
|
||||
type: NotificationType;
|
||||
cardId?: number;
|
||||
workspaceId?: number;
|
||||
commentId?: number;
|
||||
},
|
||||
) => {
|
||||
const result = await db.query.notifications.findFirst({
|
||||
where: (notifications, { eq, and, isNull: isNullFn }) => {
|
||||
const conditions = [
|
||||
eq(notifications.userId, args.userId),
|
||||
eq(notifications.type, args.type),
|
||||
isNullFn(notifications.deletedAt),
|
||||
];
|
||||
|
||||
if (args.cardId) {
|
||||
conditions.push(eq(notifications.cardId, args.cardId));
|
||||
}
|
||||
|
||||
if (args.workspaceId) {
|
||||
conditions.push(eq(notifications.workspaceId, args.workspaceId));
|
||||
}
|
||||
|
||||
return and(...conditions);
|
||||
},
|
||||
});
|
||||
|
||||
return !!result;
|
||||
};
|
||||
|
||||
export const markAsRead = async (
|
||||
db: dbClient,
|
||||
notificationId: number,
|
||||
) => {
|
||||
const [result] = await db
|
||||
.update(notifications)
|
||||
.set({ readAt: new Date() })
|
||||
.where(eq(notifications.id, notificationId))
|
||||
.returning();
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
export const getUnreadCount = async (
|
||||
db: dbClient,
|
||||
userId: string,
|
||||
) => {
|
||||
const result = await db
|
||||
.select({ count: count() })
|
||||
.from(notifications)
|
||||
.where(
|
||||
and(
|
||||
eq(notifications.userId, userId),
|
||||
isNull(notifications.readAt),
|
||||
isNull(notifications.deletedAt),
|
||||
),
|
||||
);
|
||||
|
||||
return result[0]?.count ?? 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user