Overview
DevPulse is a backend-focused issue and feature tracking system designed to help software teams report technical problems, propose improvements, and manage issue resolution through a structured API. Built with Node.js, Express.js, TypeScript, and PostgreSQL, it separates routing, controller logic, and database services to keep the codebase organized and maintainable.
The problem
Software teams need a consistent way to report bugs, suggest features, and track technical issues without losing ownership or control over changes. Without clear permissions and defined issue management rules, contributors may modify issues they do not own, and maintainers may struggle to manage the resolution process consistently.
The solution
I developed DevPulse as a RESTful backend API with user authentication, role-based authorization, and structured issue management. Users can register and log in, while authorized maintainers and contributors can create issues. Maintainers have broader issue management permissions, whereas contributors can update their own issues while those issues remain open. PostgreSQL stores users and issues, raw SQL handles database queries, bcrypt protects stored passwords, and JSON Web Tokens support authenticated access.
Key features
- User registration and login endpoints
- Password hashing with bcrypt
- JWT-based authentication
- Role-based access control for maintainers and contributors
- Issue creation for authorized users
- Retrieve all users
- Retrieve individual issues
- Issue updates with role and ownership restrictions
- Issue deletion restricted to maintainers
- Issue status-based update permissions
- PostgreSQL relational data storage
- Raw SQL database queries
- Separated routes, controllers, and service-layer logic
- TypeScript for improved type safety
- Deployed API endpoints
Challenges and how I solved them
Enforcing role-based issue permissions
Different users need different levels of control over technical issues. I implemented permission rules that distinguish maintainers from contributors, allowing maintainers to update issues while limiting contributors to updating their own issues when the status is open.
Securing authentication and stored credentials
Authentication requires both secure password storage and a mechanism for identifying authenticated users across API requests. I used bcrypt for password hashing and JSON Web Tokens to support authenticated access to protected endpoints.
Organizing database access and API logic
Keeping database queries, HTTP request handling, and business rules in one place makes backend code harder to maintain. I separated route definitions, controller responsibilities, and service-layer database operations to improve organization and make the API easier to extend.
Maintaining consistent issue management rules
Issue updates and deletions must respect both user permissions and the current issue status. I implemented conditional access rules so issue management follows the application's ownership and lifecycle requirements.
Outcome
DevPulse delivers a deployed REST API for user management and collaborative issue tracking. It demonstrates practical backend development skills, including authentication, authorization, password security, PostgreSQL integration, raw SQL queries, and layered API architecture.
What I learned
- Building RESTful APIs with Node.js and Express.js
- Structuring backend applications with routes, controllers, and services
- Implementing JWT-based authentication
- Hashing passwords securely with bcrypt
- Enforcing role-based and ownership-based authorization
- Working with PostgreSQL and raw SQL
- Designing user and issue database tables
- Implementing status-dependent business rules
- Using TypeScript to improve backend type safety
- Deploying and documenting API endpoints