Compare commits

...

2 Commits

Author SHA1 Message Date
grimhilt
12e508c7cb update backend api architecture 2023-05-02 12:25:50 +02:00
grimhilt
29b4b7bfeb fix types highestmodseq 2023-05-02 12:12:09 +02:00
9 changed files with 47 additions and 56 deletions

3
.gitignore vendored
View File

@ -31,4 +31,5 @@ log*
tmp tmp
test.* test.*
*.png *.png
!*/schemas/* !*/schemas/*
todo

View File

@ -6,6 +6,8 @@ import { getLastMsgData, getRoomOwner } from "../db/Room-db";
import emailManager from "../mails/EmailManager"; import emailManager from "../mails/EmailManager";
import MailBuilder from "../mails/utils/mailBuilder"; import MailBuilder from "../mails/utils/mailBuilder";
import { getAddresses } from "../db/utils/mail"; import { getAddresses } from "../db/utils/mail";
import { getMembers, getMessages, getRooms } from "../db/api-db";
import logger from "../system/Logger";
function rmUserFromAddrs(addresses: { email: string }[], user: string) { function rmUserFromAddrs(addresses: { email: string }[], user: string) {
let index = addresses.findIndex((a) => a.email == user); let index = addresses.findIndex((a) => a.email == user);
@ -58,4 +60,39 @@ export default class Room {
res.status(statusCode.FORBIDDEN).send({ error: "Cannot add a new message in a room or a channel." }); res.status(statusCode.FORBIDDEN).send({ error: "Cannot add a new message in a room or a channel." });
} }
} }
static async getAll(body, res: Response) {
const { mailboxId, offset, limit } = body;
getRooms(mailboxId)
.then((rooms) => {
res.status(statusCode.OK).json(rooms);
})
.catch((err) => {
logger.err(err);
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}
static async getMessages(body, res: Response) {
const { roomId } = body;
getMessages(roomId)
.then((messages) => {
res.status(statusCode.OK).json(messages);
})
.catch((err) => {
logger.err(err);
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}
static async getMembers(body, res) {
const { roomId } = body;
getMembers(roomId).then((addresses) => {
res.status(statusCode.OK).json(addresses);
}).catch((err) => {
logger.err(err)
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}
} }

View File

@ -1,13 +0,0 @@
import statusCode from "../utils/statusCodes";
import { getMembers } from "../db/api-db";
import logger from "../system/Logger";
export async function members(body, res) {
const { roomId } = body;
getMembers(roomId).then((addresses) => {
res.status(statusCode.OK).json(addresses);
}).catch((err) => {
logger.err(err)
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}

View File

@ -1,16 +0,0 @@
import statusCode from "../utils/statusCodes";
import { getMessages } from "../db/api-db";
import logger from "../system/Logger";
import { Response } from "express";
export async function messages(body, res: Response) {
const { roomId } = body;
getMessages(roomId)
.then((messages) => {
res.status(statusCode.OK).json(messages);
})
.catch((err) => {
logger.err(err);
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}

View File

@ -1,14 +0,0 @@
import statusCode from "../utils/statusCodes";
import { getRooms } from "../db/api-db";
import logger from "../system/Logger";
import { Response } from "express";
export async function rooms(body, res: Response) {
const { mailboxId, offset, limit } = body;
getRooms(mailboxId).then((rooms) => {
res.status(statusCode.OK).json(rooms);
}).catch((err) => {
logger.err(err)
res.status(statusCode.INTERNAL_SERVER_ERROR);
});
}

View File

@ -1,4 +1,4 @@
import Imap, { ImapMessageAttributes, Box } from "imap"; import Imap, { Box } from "imap";
import { getMailbox, getMailboxModseq, updateMailbox, updateMailboxModseq } from "../../db/imap/imap-db"; import { getMailbox, getMailboxModseq, updateMailbox, updateMailboxModseq } from "../../db/imap/imap-db";
import { Attrs, AttrsWithEnvelope } from "../../interfaces/mail/attrs.interface"; import { Attrs, AttrsWithEnvelope } from "../../interfaces/mail/attrs.interface";
import logger from "../../system/Logger"; import logger from "../../system/Logger";
@ -62,7 +62,7 @@ export default class Mailbox {
async updateModseq(newModseq: number) { async updateModseq(newModseq: number) {
updateMailboxModseq(this.id, newModseq).then(() => { updateMailboxModseq(this.id, newModseq).then(() => {
this.box.highestmodseq = newModseq; this.box.highestmodseq = newModseq.toString();
}); });
} }
@ -76,7 +76,7 @@ export default class Mailbox {
// sync flags // sync flags
const lastModseq = (await getMailboxModseq(this.id))[0]?.modseq ?? 0; const lastModseq = (await getMailboxModseq(this.id))[0]?.modseq ?? 0;
if (box.highestmodseq > lastModseq) { if (parseInt(box.highestmodseq) > lastModseq) {
const fetchStream = this.imap.fetch("1:*", { bodies: "", modifiers: { changedsince: lastModseq } }); const fetchStream = this.imap.fetch("1:*", { bodies: "", modifiers: { changedsince: lastModseq } });
fetchStream.on("message", (message) => { fetchStream.on("message", (message) => {
message.once("attributes", (attrs) => { message.once("attributes", (attrs) => {
@ -93,7 +93,7 @@ export default class Mailbox {
} else { } else {
logger.log("Flags already up to date") logger.log("Flags already up to date")
} }
this.updateModseq(box.highestmodseq); this.updateModseq(parseInt(box.highestmodseq));
} }
async syncMail(savedUid: number, currentUid: number) { async syncMail(savedUid: number, currentUid: number) {

View File

@ -1,10 +1,7 @@
import express from "express"; import express from "express";
const router = express.Router(); const router = express.Router();
import { rooms } from "../abl/rooms";
import Message from "../abl/Message-abl"; import Message from "../abl/Message-abl";
import { messages } from "../abl/messages";
import { members } from "../abl/members";
import Account from "../abl/Account-abl"; import Account from "../abl/Account-abl";
import validator from "../validator/validator"; import validator from "../validator/validator";
import Room from "../abl/Room-abl"; import Room from "../abl/Room-abl";
@ -21,21 +18,21 @@ router.get("/accounts", async (req, res) => {
*/ */
router.get("/:mailboxId/rooms", async (req, res) => { router.get("/:mailboxId/rooms", async (req, res) => {
// todo offet limit // todo offet limit
await validator.validate("getRooms", req.params, res, rooms); await validator.validate("getRooms", req.params, res, Room.getAll);
}); });
/** /**
* Return all messages from a room * Return all messages from a room
*/ */
router.get("/:roomId/messages", async (req, res) => { router.get("/:roomId/messages", async (req, res) => {
await validator.validate("getMessages", req.params, res, messages); await validator.validate("getMessages", req.params, res, Room.getMessages);
}); });
/** /**
* Return all members from a room * Return all members from a room
*/ */
router.get("/:roomId/members", async (req, res) => { router.get("/:roomId/members", async (req, res) => {
await validator.validate("getMembers", req.params, res, members); await validator.validate("getMembers", req.params, res, Room.getMembers);
}); });
/** /**

View File

@ -69,6 +69,7 @@ const setFlag = (flag: string, loadingState: Ref<boolean>) => {
class="option" class="option"
:loading="flaggedLoading" :loading="flaggedLoading"
:classes="hasFlag(props.msg?.flags, '\\Flagged') ? 'warn' : ''" :classes="hasFlag(props.msg?.flags, '\\Flagged') ? 'warn' : ''"
v-tooltip="hasFlag(props.msg?.flags, '\\Flagged') ? 'Unflag' : 'Flag'"
/> />
<!-- <!--
<SvgLoader <SvgLoader
@ -93,8 +94,6 @@ const setFlag = (flag: string, loadingState: Ref<boolean>) => {
<SvgLoader svg="reply-all-line" class="option" /> <SvgLoader svg="reply-all-line" class="option" />
</div> </div>
<div>reply</div> <div>reply</div>
<div>delete from all</div>
<div>delete from remote</div>
<div>transfer</div> <div>transfer</div>
<div>see source</div> <div>see source</div>
<div>{{ props.msg?.flags }}</div> <div>{{ props.msg?.flags }}</div>