From 6e228e264b407ac83c0f9f5e1ba960ff8fe5b325 Mon Sep 17 00:00:00 2001 From: Jonh Alex <122692601+Jonhvmp@users.noreply.github.com> Date: Sun, 15 Dec 2024 21:09:57 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Adicionar=20servi=C3=A7o=20?= =?UTF-8?q?de=20categorias=20com=20opera=C3=A7=C3=B5es=20de=20cria=C3=A7?= =?UTF-8?q?=C3=A3o,=20atualiza=C3=A7=C3=A3o,=20remo=C3=A7=C3=A3o=20e=20rec?= =?UTF-8?q?upera=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/snnipets/categoryService.ts | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 backend/src/services/snnipets/categoryService.ts diff --git a/backend/src/services/snnipets/categoryService.ts b/backend/src/services/snnipets/categoryService.ts new file mode 100644 index 0000000..9f738cc --- /dev/null +++ b/backend/src/services/snnipets/categoryService.ts @@ -0,0 +1,87 @@ +import * as categoryRepository from '../../repositories/categoryRepository'; + +export const createNewCategory = async (name: string, description: string, userId: string) => { + if (!name) { + throw new Error('O nome da categoria é obrigatório.'); + } + + if (name.length < 3 || name.length > 50) { + throw new Error('O nome da categoria deve ter entre 3 e 50 caracteres.'); + } + + if (description && description.length > 255) { + throw new Error('A descrição da categoria deve ter no máximo 255 caracteres.'); + } + + // Verificar se a categoria já existe para o usuário + const existingCategories = await categoryRepository.findCategoriesByUser(userId); + const isDuplicate = existingCategories.some((category) => category.name === name); + + if (isDuplicate) { + throw new Error('Uma categoria com esse nome já existe.'); + } + + return categoryRepository.createCategory(name, userId, description); +}; + +export const getUserCategories = (userId: string) => { + if (!userId) { + throw new Error('ID do usuário é obrigatório.'); + } + return categoryRepository.findCategoriesByUser(userId); +}; + +export const updateCategory = async ( + id: string, + name: string, + description: string, + userId: string +) => { + if (!name) { + throw new Error('O nome da categoria é obrigatório.'); + } + + if (name.length < 3 || name.length > 50) { + throw new Error('O nome da categoria deve ter entre 3 e 50 caracteres.'); + } + + if (description && description.length > 255) { + throw new Error('A descrição da categoria deve ter no máximo 255 caracteres.'); + } + + // Garantir que não exista outra categoria com o mesmo nome para o usuário + const categories = await categoryRepository.findCategoriesByUser(userId); + const isDuplicate = categories.some((category) => category.name === name && category._id.toString() !== id); + + if (isDuplicate) { + throw new Error('Uma categoria com esse nome já existe.'); + } + + return categoryRepository.updateCategoryById(id, name, description); +}; + +export const removeCategory = async (id: string, userId: string) => { + const category = await categoryRepository.findCategoryById(id); + if (!category) { + throw new Error('Categoria não encontrada.'); + } + + if (category.user.toString() !== userId) { + throw new Error('Você não tem permissão para deletar esta categoria.'); + } + + return categoryRepository.deleteCategory(id, userId); +}; + +export const getCategoryById = async (id: string, userId: string) => { + const category = await categoryRepository.findCategoryById(id); + if (!category) { + throw new Error('Categoria não encontrada.'); + } + + if (category.user.toString() !== userId) { + throw new Error('Você não tem permissão para visualizar esta categoria.'); + } + + return category; +};