feat: add repo funcs
This commit is contained in:
@@ -420,6 +420,7 @@ export const getWithListAndMembersByPublicId = async (
|
|||||||
) => {
|
) => {
|
||||||
const card = await db.query.cards.findFirst({
|
const card = await db.query.cards.findFirst({
|
||||||
columns: {
|
columns: {
|
||||||
|
id: true,
|
||||||
publicId: true,
|
publicId: true,
|
||||||
title: true,
|
title: true,
|
||||||
description: 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 (
|
export const getByEmailAndStatus = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
email: string,
|
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