149 lines
3.7 KiB
Markdown
149 lines
3.7 KiB
Markdown
# Todo App with Node.js, Express, and PostgreSQL
|
|
|
|
A full-stack Todo application with user authentication built using Node.js, Express, PostgreSQL, and JWT.
|
|
|
|
## Features
|
|
|
|
- User authentication (register, login, logout)
|
|
- JWT-based session management with HTTP-only cookies
|
|
- Create, read, update, and delete todo items
|
|
- Responsive UI with real-time updates
|
|
- PostgreSQL database storage
|
|
- Docker support for development
|
|
|
|
## Technologies Used
|
|
|
|
- **Backend**: Node.js, Express.js
|
|
- **Database**: PostgreSQL
|
|
- **Authentication**: JWT (JSON Web Tokens), bcrypt for password hashing
|
|
- **Frontend**: HTML, CSS, JavaScript (Vanilla)
|
|
- **Development Tools**: Docker, Nodemon
|
|
|
|
## Setup Instructions
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js (v14 or newer)
|
|
- npm or yarn
|
|
- Docker and Docker Compose (for containerized database)
|
|
- PostgreSQL (if not using Docker)
|
|
|
|
### Installation
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone https://git.mahom03-spacecloud.de/CodeDevMLH/ToDo-App_Node.js_Test.git
|
|
cd ToDo-App_Node.js_Test
|
|
```
|
|
|
|
2. Install dependencies:
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
### Database Setup
|
|
|
|
#### Using Docker:
|
|
|
|
1. Start PostgreSQL container:
|
|
```bash
|
|
npm run create-db-container
|
|
```
|
|
|
|
2. Create the database:
|
|
```bash
|
|
npm run db:create
|
|
```
|
|
|
|
3. Initialize the database with tables:
|
|
```bash
|
|
npm run db:init
|
|
```
|
|
|
|
#### Manual Setup:
|
|
|
|
1. Create a PostgreSQL database named `todo_app_db`
|
|
2. Run the SQL script in `/db/init_postgres.sql` to create tables
|
|
|
|
### Environment Configuration
|
|
|
|
Create a `.env` file in the root directory with the following variables:
|
|
|
|
```
|
|
# PostgreSQL Database Configuration
|
|
DB_USER=postgres
|
|
DB_HOST=localhost
|
|
DB_DATABASE=todo_app_db
|
|
DB_PASSWORD=password
|
|
DB_PORT=5432
|
|
|
|
# JWT Configuration
|
|
JWT_SECRET=your_secure_secret_key
|
|
JWT_EXPIRES_IN=1h
|
|
|
|
# Server Configuration
|
|
PORT=3000
|
|
```
|
|
|
|
> **Important** Replace `your_secure_secret_key` with a strong, random secret for production use.
|
|
|
|
### Running the Application
|
|
|
|
Development mode with auto-restart:
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
Production mode:
|
|
```bash
|
|
npm start
|
|
```
|
|
|
|
Access the application at: http://localhost:3000
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
- **POST** `/api/auth/register` - Register a new user
|
|
- **POST** `/api/auth/login` - Log in a user
|
|
- **POST** `/api/auth/logout` - Log out the current user
|
|
- **GET** `/api/auth/status` - Check user's authentication status
|
|
|
|
### Todo Items
|
|
|
|
- **GET** `/api/todos` - Get all todos for logged-in user
|
|
- **POST** `/api/todos/newEntry` - Create a new todo
|
|
- **PUT** `/api/todos/:id` - Update a todo's completion status
|
|
- **DELETE** `/api/todos/:id` - Delete a todo
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
.
|
|
├── db/
|
|
│ └── init_postgres.sql # Database initialization script
|
|
├── middleware/
|
|
│ └── authMiddleware.js # JWT authentication middleware
|
|
├── public/ # Static frontend files
|
|
│ ├── index.html # Main todo app page
|
|
│ ├── login.html # Login page
|
|
│ ├── register.html # Registration page
|
|
│ ├── script.js # Frontend JavaScript
|
|
│ └── style.css # CSS styles
|
|
├── routes/
|
|
│ ├── authRoutes.js # Authentication routes
|
|
│ ├── todoRoutes.js # Todo CRUD operations
|
|
│ └── viewRoutes.js # HTML page serving
|
|
├── .env # Environment variables
|
|
├── .gitignore # Git ignore file
|
|
├── db.js # Database connection setup
|
|
├── package.json # Project dependencies
|
|
├── README.md # Project documentation
|
|
└── server.js # Main application entry point
|
|
```
|
|
|
|
|
|
---
|
|
|
|
*This project was created for learning and demonstration purposes only.* |