API Rest pensada como servidor para aplicaciones de gestión de gastos personales. La aplicación todavia se encuentra en desarrollo, aunque ya es posible acceder a los endpoints para manipular la base de datos a partir de toda la estructura interna por capas de la aplicación, aún hay funcionalidades que se desean en la aplicación y por la ventana de entrega del PI no se pudieron desarrollar, como algún método para la autenticación de usuarios y administradores, la encriptación y validación de contraseñas, métodos de administrador para la gestión de usuarios y algunos tests unitarios para probar funcionalidades de forma exhaustiva. Por otra lado, gran parte de los endpoints para completar el CRUD de las 4 entidades principales del proyecto ya fueron completados y probados, como también ya está totalmente definida la estrucutura de la base de datos y sus relaciones, por lo que bastarían sólo métodos concernientes a la lógica del negocio como tal.
- Existen 4 entidades principales en la aplicación: Accounts, Users, Expenses y Revenues.
- Las categorias definidas para los gastos son: 'automovil', 'casa', 'comida', 'comunicaciones', 'deportes', 'entretenimiento', 'facturas', 'higiene', 'mascotas', 'regalos', 'restaurante', 'ropa', 'salud', 'taxi' y 'transporte'.
- Las categorias definidas para los ingresos son: 'ahorros', 'depositos', 'regalos' y 'salario'.
- Cada cuenta tiene un saldo global, además de tener asociados uno o varios usuarios y sus gastos o ingresos, que se ven reflejados en el saldo global de la cuenta.
- Cada cuenta se protege por contraseña y es sólo administrable por el usuario definido como administrador.
- Cada usuario y sus transacciones son sólo modificables por el usuario, el cual está protegido por un pin de acceso.
- Se pueden eliminar las cuentas, esto afectará a todas las transacciones de sus usuarios puesto que se asocian al saldo global, por lo que tambien se eliminan.
- Al eliminar una cuenta, no se eliminan los usuarios pero sí se desvinculan, haciendo posible vincularlos a otras cuentas o crear la suya propia siendo administrador.
- Por otro lado, al eliminar un usuario, se eliminarán todas las transacciones asociadas a él, pero esto no afectará el saldo global de la cuenta.
- Al solicitar algún registro, algunos campos del cuerpo de respuesta pueden venir en "null", esto debido a que se usó una plantilla de respuesta que está pensada para integrarse con otras solicitudes, como por ejemplo el campo "expenses" al traernos un usuario está pensado para integrarse con la solicitud que permite traer los gastos asociados a un usuario.
- Las rutas para actualizar campos especificos de una entidad toman como cuerpo de la solicitud todos los datos que tiene la entidad, pero sólo toman en cuenta el campo especifico que se quiere actualizar, esto por el momento pues se espera en el futuro poder tomar datos como la contraseña de la cuenta para validar antes de hacer cambios a la entidad.
POST /api/v1/users
Crea un nuevo usuario en el sistema.
username(string): El nombre del usuario.email(string): La dirección de correo electrónico del usuario.accountId(string): La cuenta a la que pertenece al usuario (puede ser null mientras se crea y asigna la cuenta).pin(string): El pin de seguridad del usuario.
{
"username": "alidev",
"email": "estiven25b777@gmail.com",
"accountId": null,
"pin": "12345"
}POST /api/v1/accounts
Crea una nueva cuenta en el sistema.
adminId(int): El id del usuario administrador de la cuenta (no puede ser null).description(string): La descripción de la cuenta.accountName(string): El nombre para la cuenta.password(string): La contraseña para la cuenta.balance(double): El saldo inicial al crear la cuenta
{
"adminId": 1,
"description": "Cuenta de gastos alidev",
"accountName": "AlidevCash",
"password": "12345",
"balance": 0.0
}POST /api/v1/expenses
Crea un nuevo gasto en el sistema.
amount(double): La cantidad del gasto.type(string): La categoria del gasto.description(string): La descripción del gasto.userId(int): El id del usuario que realiza el gasto en la cuenta.
{
"amount": 20000,
"type": "casa",
"description": "Cuchara para huevos",
"userId": 1
}POST /api/v1/revenues
Crea un nuevo ingreso en el sistema.
amount(double): La cantidad del ingreso.type(string): La categoria del ingreso.description(string): La descripción del ingreso.userId(int): El id del usuario que realiza el ingreso en la cuenta.
{
"amount": 20000,
"type": "casa",
"description": "Cuchara para huevos",
"userId": 1
}DELETE /api/v1/accounts?id={id}
Eliminar una cuenta del sistema y sus transacciones asociadas.
id(int): ID único de la cuenta.
DELETE /api/v1/users?id={id}
Eliminar una usuario del sistema y sus transacciones asociadas.
id(int): ID único del usuario.
DELETE /api/v1/expenses?account={accountId}&id={id}
Eliminar un gasto que se haya registrado recientemente para no afectar el historial del saldo.
id(int): ID único del gasto.account(int): ID único de la cuenta asociada al gasto.
DELETE /api/v1/revenues?account={accountId}&id={id}
Eliminar un ingreso que se haya registrado recientemente para no afectar el historial del saldo.
id(int): ID único del ingreso.account(int): ID único de la cuenta asociada al ingreso.
GET /api/v1/accounts/id?id={id}
Obtener toda la información de una cuenta a partir de su ID único.
id(int): ID único de la cuenta.
GET /api/v1/accounts/admin?admin={adminId}
Obtener toda la información de una cuenta a partir del ID único de su usuario administrador.
id(int): ID único del administrador.
GET /api/v1/users/id?id={id}
Obtener toda la información de un usuario a partir de su ID único.
id(int): ID único del usuario.
GET /api/v1/users/email?email={email}
Obtener toda la información de un usuario a partir de su email asociado.
email(string): Email asociado al usuario.
GET /api/v1/users/username?username={username}
Obtener toda la información de un usuario a partir de su nombre de usuario.
username(string): Nombre del usuario.
GET /api/v1/expenses/id?id={id}
Obtener toda la información de un gasto a partir de su ID único.
id(int): ID único del gasto.
GET /api/v1/expenses/user?user={userId}
Obtener toda la información de un gasto a partir del ID único del usuario que lo realizó.
user(int): ID único del usuario.
GET /api/v1/revenues/id?id={id}
Obtener toda la información de un ingreso a partir de su ID único.
id(int): ID único del ingreso.
GET /api/v1/revenues/user?user={userId}
Obtener toda la información de un ingreso a partir del ID único del usuario que lo realizó.
user(int): ID único del usuario.
UPDATE /api/v1/accounts/accountname?id={id}
Actualizar el nombre de una cuenta.
id(int): ID único de la cuenta a actualizar.
adminId(int): ID del usuario administrador.description(string): Descripción de la cuenta.accountName(string): Nuevo nombre asociado a la cuenta.password(string): La contraseña de la cuenta.balance(double): El saldo de la cuenta.
{
"adminId": 1,
"description": "Cuenta ejemplo",
"accountName": "Nuevo nombre de cuenta",
"password": "12345",
"balance": 0.0
}UPDATE /api/v1/accounts/admin?id={id}
Actualizar el usuario administrador de una cuenta.
id(int): ID único de la cuenta a actualizar.
adminId(int): ID del nuevo usuario administrador.description(string): Descripción de la cuenta.accountName(string): Nombre asociado a la cuenta.password(string): La contraseña de la cuenta.balance(double): El saldo de la cuenta.
{
"adminId": 1,
"description": "Cuenta ejemplo",
"accountName": "Ejemplo",
"password": "12345",
"balance": 0.0
}UPDATE /api/v1/accounts/description?id={id}
Actualizar la descripción de una cuenta.
id(int): ID único de la cuenta a actualizar.
adminId(int): ID del usuario administrador.description(string): Nueva descripción de la cuenta.accountName(string): Nombre asociado a la cuenta.password(string): La contraseña de la cuenta.balance(double): El saldo de la cuenta.
{
"adminId": 1,
"description": "Nueva descripción de cuenta",
"accountName": "Ejemplo",
"password": "12345",
"balance": 0.0
}UPDATE /api/v1/accounts/password?id={id}
Actualizar la contraseña de una cuenta.
id(int): ID único de la cuenta a actualizar.
adminId(int): ID del usuario administrador.description(string): Descripción de la cuenta.accountName(string): Nombre asociado a la cuenta.password(string): Nueva contraseña de la cuenta.balance(double): El saldo de la cuenta.
{
"adminId": 1,
"description": "Cuenta ejemplo",
"accountName": "Ejemplo",
"password": "Nueva contraseña",
"balance": 0.0
}UPDATE /api/v1/users/account?id={id}
Actualizar la cuenta asociada a un usuario.
id(int): ID único del usuario a actualizar.
username(string): Nombre de usuario.email(string): Email del usuario.accountId(int): ID de la nueva cuenta asociada al usuario.pin(string): El PIN de seguridad del usuario.
{
"username": "Ejemplo",
"email": "ejemplo@gmail.com",
"accountId": 1,
"pin": "12345"
}UPDATE /api/v1/users/username?id={id}
Actualizar el nombre de usuario.
id(int): ID único del usuario a actualizar.
username(string): Nuevo nombre de usuario.email(string): Email del usuario.accountId(int): ID de la cuenta asociada al usuario.pin(string): El PIN de seguridad del usuario.
{
"username": "Nuevo username",
"email": "ejemplo@gmail.com",
"accountId": 1,
"pin": "12345"
}UPDATE /api/v1/users/email?id={id}
Actualizar el email asociado al usuario.
id(int): ID único del usuario a actualizar.
username(string): Nombre de usuario.email(string): Nuevo email del usuario.accountId(int): ID de la cuenta asociada al usuario.pin(string): El PIN de seguridad del usuario.
{
"username": "Ejemplo",
"email": "nuevoEmail@gmail.com",
"accountId": 1,
"pin": "12345"
}UPDATE /api/v1/users/pin?id={id}
Actualizar el PIN de seguridad de un usuario.
id(int): ID único del usuario a actualizar.
username(string): Nmbre de usuario.email(string): Email del usuario.accountId(int): ID de la cuenta asociada al usuario.pin(string): Nuevo PIN de seguridad del usuario.
{
"username": "Ejemplo",
"email": "ejemplo@gmail.com",
"accountId": 1,
"pin": "Nuevo PIN"
}UPDATE /api/v1/expenses/description?id={id}
Actualizar la descripción de un gasto.
id(int): ID único del gasto a actualizar.
amount(double): Cantidad asociada al gasto.type(string): Categoria del gasto.description(string): Nueva descripción del gasto.userId(int): ID único del usuario que realizó el gasto.
{
"amount": 20000,
"type": "ejemplo",
"description": "Nueva descripción del gasto",
"userId": 1
}UPDATE /api/v1/expenses/type?id={id}
Actualizar la categoria de un gasto.
id(int): ID único del gasto a actualizar.
amount(double): Cantidad asociada al gasto.type(string): Nueva categoria del gasto.description(string): Descripción del gasto.userId(int): ID único del usuario que realizó el gasto.
{
"amount": 20000,
"type": "nuevo tipo de gasto",
"description": "Gasto de ejemplo",
"userId": 1
}UPDATE /api/v1/revenues/description?id={id}
Actualizar la descripción de un ingreso.
id(int): ID único del ingreso a actualizar.
amount(double): Cantidad asociada al ingreso.type(string): Categoria del ingreso.description(string): Nueva descripción del ingreso.userId(int): ID único del usuario que realizó el ingreso.
{
"amount": 20000,
"type": "ejemplo",
"description": "Nueva descripción de ingreso",
"userId": 1
}UPDATE /api/v1/revenues/type?id={id}
Actualizar la categoria de un ingreso.
id(int): ID único del ingreso a actualizar.
amount(double): Cantidad asociada al ingreso.type(string): Nueva categoria del ingreso.description(string): Descripción del ingreso.userId(int): ID único del usuario que realizó el ingreso.
{
"amount": 20000,
"type": "nuevo tipo de ingreso",
"description": "Gasto de ejemplo",
"userId": 1
}