/ Detalles del proyecto

04 Nov 2025
Retomando C# y .NET, herramientas que manejé en varios proyectos durante la universidad, decidí realizar este proyecto para crear un sistema donde los usuarios puedan registrarse, iniciar sesión con un token JWT (administrados por Redis) y adquirir una suscripción a un sistema ficticio.
El proyecto demuestra mi conocimiento en C#, .NET, Docker, Redis, tokens JWT, SMTP, Stripe, webhooks, MariaDB y diseño de API REST.
El proyecto es fácil de instalar; únicamente hace falta ejecutar el siguiente comando:
docker compose up -d
Es necesario ingresar por primera vez al contenedor net_restapi_subscriptions_debian_container para instalar manualmente las dependencias requeridas y configurar la base de datos dentro del contenedor net_restapi_subscriptions_mariadb_container.
dotnet restore
echo 'export PATH="$PATH:/root/.dotnet/tools"' >> ~/.bashrc
source ~/.bashrc
dotnet tool install --global dotnet-ef
# on error
dotnet tool install --global dotnet-ef --version 9.0.11
dotnet ef database update
# Iniciar servidor
dotnet run
Al instalar la base de datos, automáticamente se utiliza un seeder para contar con las siguientes suscripciones:
El sistema cuenta con cuatro categorías distintas para agrupar los endpoints disponibles.

/api/Admin/users: los usuarios con rol de administrador pueden obtener el listado de todos los usuarios registrados en el sistema./api/Admin/loginas: los usuarios con rol de administrador pueden obtener el token de acceso y el refresh token de un usuario; únicamente se debe proporcionar el correo electrónico. No es necesario proporcionar la contraseña./api/Admin/ban: los usuarios con rol de administrador pueden bloquear la cuenta de un usuario; si existen tokens almacenados en Redis, estos se invalidan. Para realizar esta acción, se debe proporcionar el correo electrónico./api/Admin/unban: los usuarios con rol de administrador pueden desbloquear la cuenta de un usuario; para ello se debe proporcionar el correo electrónico./api/Admin/assign-subscription: los usuarios con rol de administrador pueden asignar una suscripción a un usuario; se debe proporcionar el correo electrónico, el ID único del tipo de suscripción a asignar y la duración en días./api/Admin/create-subscription-type: los usuarios con rol de administrador pueden crear un nuevo tipo de suscripción proporcionando el nombre, el precio mensual, el límite de almacenamiento en GB y si dicho tipo de suscripción contará con acceso a características Premium./api/Admin/update-subscription-type: los usuarios con rol de administrador pueden actualizar dinámicamente un tipo de suscripción proporcionando el ID único del tipo de suscripción y uno o más de los campos disponibles para actualizar./api/Admin/update-subscription-type: los usuarios con rol de administrador pueden eliminar un tipo de suscripción proporcionando el ID único del tipo de suscripción.
/api/Auth/register: disponible de manera pública, permite el registro de nuevos usuarios en el sistema. Todos los usuarios nuevos se registran con el rol Commoner. Para asignar el rol de administrador, es necesario hacerlo manualmente en la base de datos o mediante un script auxiliar. Por el momento, el único correo que tiene asignado el rol de administrador por defecto es scp2538@gmail.com./api/Auth/login: proporciona accessToken y refreshToken si el acceso por correo y contraseña es correcto. El accessToken expira cada hora y el refreshToken expira cada dos días (ajustable dentro de appsettings.json)./api/Auth/forgot-password: requiere un correo electrónico para poder hacer uso de SMTP, mediante el cual se envía al usuario una llave para restablecer su contraseña. Esta llave debe utilizarse en el endpoint /api/Auth/reset-password./api/Auth/reset-password: Requiere un correo electrónico, el token recibido por correo y la nueva contraseña. A partir de ese momento, el usuario deberá iniciar sesión con sus credenciales actualizadas./api/Auth/logout: para salir del sistema, se debe proporcionar el refreshToken previamente obtenido al iniciar sesión. Una vez ejecutada la operación, el usuario deberá generar nuevamente sus tokens de acceso para poder utilizar su cuenta./api/Auth/me: proporciona detalles de la cuenta: nombre de usuario, correo electrónico y nombre completo. En este caso, el sistema se configuró para que el nombre de usuario y el correo sean el mismo valor../api/Auth/me: en su versión PUT, permite actualizar la contraseña o el nombre completo de la cuenta./api/Auth/refresh: se debe proporcionar un refreshToken vigente para regenerar los tokens de acceso.Para realizar pruebas con Stripe, se requieren los siguientes comandos:
# Instalar stripe CLI en el contenedor de manera manual
wget https://github.com/stripe/stripe-cli/releases/download/v1.32.0/stripe_1.32.0_linux_amd64.deb
dpkg -i stripe_1.32.0_linux_amd64.deb
rm stripe_1.32.0_linux_amd64.deb
# Login
stripe login
# Iniciar stripe webhook para pruebas locales
stripe listen --forward-to localhost:8080/api/stripewebhook

/api/StripeWebhook: permite validar las transacciones con Stripe cuando un usuario compra un tipo de suscripción. Este endpoint, aunque es público, solo puede ser utilizado por Stripe.
/api/Subscriptions/me: obtiene los datos completos de la suscripción activa del usuario./api/Subscriptions/purchase: solo para pruebas, permite la compra de un tipo de suscripción para el usuario. En producción, este endpoint debe eliminarse, ya que create-checkout-session es el encargado de administrar los pagos con Stripe y habilitar la suscripción del usuario una vez confirmado el pago mediante el webhook./api/Subscriptions/plans: obtiene los detalles completos de todos los tipos de planes existentes en el sistema. Es esencial para obtener el ID único de un tipo de suscripción y generar una orden de compra con Stripe mediante create-checkout-session./api/Subscriptions/history: obtiene el historial de suscripciones adquiridas por el usuario./api/Subscriptions/create-checkout-session: utiliza el ID único de un tipo de suscripción para generar la orden de compra. Devuelve un enlace para proceder con la compra en Stripe./api/Subscriptions/verify-session: una vez que se complete el formulario de la orden de compra en Stripe, se puede utilizar este endpoint para verificar en una plataforma web si la compra fue exitosa. De esta manera, es posible mostrar una vista al usuario para informarle sobre el estado de la transacción (completada o cancelada).A continuación se muestra el uso de Stripe con un frontend HTML5 básico, utilizando plantillas del framework .NET. Puedes acceder al formulario de inicio de sesión desde Login





A full-stack platform for service scheduling
Diseñé e implementé un sistema de replicación de datos en tiempo real capaz de manejar millones de inserciones de filas por día.
En este proyecto desarrollé un grabador de pantalla en Python capaz de capturar en video la actividad del escritorio en Windows.