86 lines
1.6 KiB
TypeScript
86 lines
1.6 KiB
TypeScript
/**
|
|
* Queries de favoritos usando Prisma
|
|
*/
|
|
|
|
import { prisma } from "../app";
|
|
|
|
/**
|
|
* Verifica se um anúncio está favoritado por um usuário
|
|
*/
|
|
export async function isFavorite(
|
|
userId: number,
|
|
listingId: number,
|
|
): Promise<boolean> {
|
|
const favorite = await prisma.userFavorite.findUnique({
|
|
where: {
|
|
user_id_ad_id: {
|
|
user_id: userId,
|
|
ad_id: listingId,
|
|
},
|
|
},
|
|
});
|
|
|
|
return !!favorite;
|
|
}
|
|
|
|
/**
|
|
* Favorita um anúncio
|
|
*/
|
|
export async function addFavorite(
|
|
userId: number,
|
|
listingId: number,
|
|
): Promise<void> {
|
|
await prisma.userFavorite.upsert({
|
|
where: {
|
|
user_id_ad_id: {
|
|
user_id: userId,
|
|
ad_id: listingId,
|
|
},
|
|
},
|
|
create: {
|
|
user_id: userId,
|
|
ad_id: listingId,
|
|
},
|
|
update: {}, // Se já existe, não faz nada
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Remove favorito de um anúncio
|
|
*/
|
|
export async function removeFavorite(
|
|
userId: number,
|
|
listingId: number,
|
|
): Promise<void> {
|
|
await prisma.userFavorite
|
|
.delete({
|
|
where: {
|
|
user_id_ad_id: {
|
|
user_id: userId,
|
|
ad_id: listingId,
|
|
},
|
|
},
|
|
})
|
|
.catch(() => {
|
|
// Ignorar erro se não existir (idempotente)
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Toggle favorite (favorita se não estiver, desfavorita se estiver)
|
|
*/
|
|
export async function toggleFavorite(
|
|
userId: number,
|
|
listingId: number,
|
|
): Promise<boolean> {
|
|
const isFavorited = await isFavorite(userId, listingId);
|
|
|
|
if (isFavorited) {
|
|
await removeFavorite(userId, listingId);
|
|
return false;
|
|
} else {
|
|
await addFavorite(userId, listingId);
|
|
return true;
|
|
}
|
|
}
|