feat: implement Radicale CardDAV sync utility and update contact handling for asynchronous sync

This commit is contained in:
2025-12-04 11:37:13 +01:00
parent 22503e1ce0
commit 3292435e68
6 changed files with 468 additions and 1 deletions

View File

@@ -6,6 +6,7 @@ import {
hardDeleteContact,
} from "@/lib/queries/contacts";
import { withAuth } from "@/lib/middleware/auth";
import { syncContactAsync, deleteContactAsync } from "@/lib/radicale-sync";
// GET: Get contact by ID
async function getContactHandler(req, { params }) {
@@ -62,6 +63,9 @@ async function updateContactHandler(req, { params }) {
);
}
// Sync to Radicale asynchronously (non-blocking)
syncContactAsync(contact);
return NextResponse.json(contact);
} catch (error) {
console.error("Error updating contact:", error);
@@ -82,9 +86,13 @@ async function deleteContactHandler(req, { params }) {
if (hard) {
// Hard delete - permanently remove
hardDeleteContact(contactId);
// Delete from Radicale asynchronously
deleteContactAsync(contactId);
} else {
// Soft delete - set is_active to 0
deleteContact(contactId);
// Delete from Radicale asynchronously
deleteContactAsync(contactId);
}
return NextResponse.json({ message: "Contact deleted successfully" });

View File

@@ -5,6 +5,7 @@ import {
getContactStats,
} from "@/lib/queries/contacts";
import { withAuth } from "@/lib/middleware/auth";
import { syncContactAsync } from "@/lib/radicale-sync";
// GET: Get all contacts with optional filters
async function getContactsHandler(req) {
@@ -58,6 +59,10 @@ async function createContactHandler(req) {
}
const contact = createContact(data);
// Sync to Radicale asynchronously (non-blocking)
syncContactAsync(contact);
return NextResponse.json(contact, { status: 201 });
} catch (error) {
console.error("Error creating contact:", error);