Files
cloud-mail/mail-worker/src/service/star-service.js
2025-07-22 22:02:23 +08:00

84 lines
2.0 KiB
JavaScript

import orm from '../entity/orm';
import { star } from '../entity/star';
import emailService from './email-service';
import BizError from '../error/biz-error';
import { and, desc, eq, lt, sql, inArray } from 'drizzle-orm';
import email from '../entity/email';
import { isDel } from '../const/entity-const';
import attService from "./att-service";
import { t } from '../i18n/i18n'
const starService = {
async add(c, params, userId) {
const { emailId } = params;
const email = await emailService.selectById(c, emailId);
if (!email) {
throw new BizError(t('starNotExistEmail'));
}
if (!email.userId === userId) {
throw new BizError(t('starNotExistEmail'));
}
const exist = await orm(c).select().from(star).where(
and(
eq(star.userId, userId),
eq(star.emailId, emailId)))
.get()
if (exist) {
return
}
await orm(c).insert(star).values({ userId, emailId }).run();
},
async cancel(c, params, userId) {
const { emailId } = params;
await orm(c).delete(star).where(
and(
eq(star.userId, userId),
eq(star.emailId, emailId)))
.run();
},
async list(c, params, userId) {
let { emailId, size } = params;
emailId = Number(emailId);
size = Number(size);
if (!emailId) {
emailId = 9999999999;
}
const list = await orm(c).select({
isStar: sql`1`.as('isStar'),
starId: star.starId
, ...email
}).from(star)
.leftJoin(email, eq(email.emailId, star.emailId))
.where(
and(
eq(star.userId, userId),
eq(email.isDel, isDel.NORMAL),
lt(star.emailId, emailId)))
.orderBy(desc(star.emailId))
.limit(size)
.all();
const emailIds = list.map(item => item.emailId);
const attsList = await attService.selectByEmailIds(c, emailIds);
list.forEach(emailRow => {
const atts = attsList.filter(attsRow => attsRow.emailId === emailRow.emailId);
emailRow.attList = atts;
});
return { list };
},
async removeByEmailIds(c, emailIds) {
await orm(c).delete(star).where(inArray(star.emailId, emailIds)).run();
}
};
export default starService;