---
# System prepended metadata

title: Bloom-Backend

---

# Bloom-Backend

A backend API for user authentication, authorization, and management, featuring JWT-based Access and Refresh Tokens, HWID linking, and key-based registration with flexible access durations.

## Table of Contents

- [Prerequisites](#prerequisites)
- [Installation](#installation)
- [Configuration](#configuration)
- [Running the Server](#running-the-server)
- [API Endpoints](#api-endpoints)
  - [Authentication and User Management](#authentication-and-user-management)
  - [Register Key Management (Admin Only)](#register-key-management-admin-only)
  - [Role Management (Admin Only)](#role-management-admin-only)
- [JWT Authentication (Access & Refresh Tokens)](#jwt-authentication-access--refresh-tokens)
- [Database Structure](#database-structure)

## Prerequisites

Before you begin, ensure you have met the following requirements:

*   Node.js (v12 or higher recommended)
*   MongoDB (running instance)
*   pnpm or npm

## Installation

1.  Clone the repository:

    ```bash
    git clone <repository_url>
    cd <repository_directory>
    ```

2.  Install dependencies using pnpm or npm:

    ```bash
    pnpm install
    # or
    npm install
    ```

## Configuration

Create a `.env` file in the root directory of the project with the following environment variables:

```dotenv
JWT_SECRET=your_super_strong_and_unique_jwt_secret_key
MONGO_URI=mongodb://localhost:27017/your_database_name
# Add other environment variables as needed
```

*   `JWT_SECRET`: **REQUIRED.** Replace with a strong, unique secret key for signing JWTs. **Do not use 'secret_key' in production.** This is crucial for security.
*   `MONGO_URI`: **REQUIRED.** Replace with your MongoDB connection string.

## Running the Server

Start the server using the following command:

```bash
node server.js
# or using pnpm/npm script if configured (check package.json):
# pnpm start
# npm start
```

The server should start and listen on port 3000 (or the port configured in `server.js`).

## API Endpoints

You can interact with the API using tools like `curl` or Postman.

### Authentication and User Management

*   **`POST /api/user/register`**
    Register a new user using a register key. Requires `username`, `password`, `repeatPassword`, and `registerKey` in the request body.

    ```bash
    curl -X POST http://localhost:3000/api/user/register \
      -H 'Content-Type: application/json' \
      -d '{
        "username": "newuser",
        "password": "securepassword",
        "repeatPassword": "securepassword",
        "registerKey": "valid_unused_key"
      }'
    ```

*   **`POST /api/user/login`**
    Login a user. Requires `username` and `password` in the request body. Returns `accessToken` and `refreshToken` upon success.

    ```bash
    curl -X POST http://localhost:3000/api/user/login \
      -H 'Content-Type: application/json' \
      -d '{
        "username": "your_username",
        "password": "your_password"
      }'
    ```

*   **`POST /api/user/refresh-token`**
    Attempt to refresh tokens. This endpoint is currently routed to a placeholder or incorrect handler in the code as of the last commit. **Note: This endpoint's functionality may be broken or incorrect based on recent code changes.**

    ```bash
    curl -X POST http://localhost:3000/api/user/refresh-token \
      -H 'Content-Type: application/json' \
      -d '{
        "refreshToken": "your_existing_refresh_token"
      }'
    ```

*   **`GET /api/user/me`**
    Get the authenticated user's information. Requires a valid `accessToken` in the `Authorization: Bearer <token>` header.

    ```bash
    curl -X GET http://localhost:3000/api/user/me \
      -H 'Authorization: Bearer your_access_token'
    ```

*   **`POST /api/user/me/changepassword`**
    Change the authenticated user's password. Requires a valid `accessToken` in the `Authorization` header and `currentPassword`, `password`, `repeatPassword` in the request body. Invalidates all refresh tokens for the user upon success.

    ```bash
    curl -X POST http://localhost:3000/api/user/me/changepassword \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer your_access_token' \
      -d '{
        "currentPassword": "old_password",
        "password": "new_password",
        "repeatPassword": "new_password"
      }'
    ```

*   **`POST /api/user/updateHwid`**
    Update the authenticated user's HWID. Requires a valid `accessToken` and `hwid` in the request body. Subject to a 30-day cooldown for regular users.

    ```bash
    curl -X POST http://localhost:3000/api/user/updateHwid \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer your_access_token' \
      -d '{
        "hwid": "new_hardware_id"
      }'
    ```
    *Admin users can update other users' HWID by including `userId` in the body (requires admin access token).*

*   **`POST /api/user/check`**
    Check client access using username and HWID. Likely used by the client application.

    ```bash
    curl -X POST http://localhost:3000/api/user/check \
      -H 'Content-Type: application/json' \
      -d '{
        "username": "user_to_check",
        "hwid": "client_hardware_id"
      }'
    ```

*   **`GET /api/user/:id`** (Admin Only)
    Get a user's information by ID. Requires admin `accessToken`.

*   **`PUT /api/user/:id`** (Admin Only)
    Update a user's information by ID. Requires admin `accessToken`. Does not handle HWID updates (use `/api/user/updateHwid`). Invalidates refresh tokens if password is changed by admin.

*   **`DELETE /api/user/:id`** (Admin Only)
    Delete a user by ID. Requires admin `accessToken`. Deletes associated refresh tokens.

*   **`GET /api/user/`** (Admin Only)
    List all users. Requires admin `accessToken`. Excludes passwords and refresh tokens from results.

### Register Key Management (Admin Only)

These endpoints require a valid `accessToken` from an **admin** user.

*   **`POST /api/register-keys/create`**
    Create a new register key. Optionally accepts `durationDays` (number of days) and `isLifetime` (boolean) in the body to define the access duration provided by the key.

    ```bash
    curl -X POST http://localhost:3000/api/register-keys/create \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer admin_access_token' \
      -d '{
        "durationDays": 90,
        "isLifetime": false
      }'
    ```

*   **`GET /api/register-keys/list`**
    List all register keys.

    ```bash
    curl -X GET http://localhost:3000/api/register-keys/list \
      -H 'Authorization: Bearer admin_access_token'
    ```

*   **`DELETE /api/register-keys/delete/:key`**
    Delete a specific register key by key string.

    ```bash
    curl -X DELETE http://localhost:3000/api/register-keys/delete/key_to_delete \
      -H 'Authorization: Bearer admin_access_token'
    ```

### Role Management (Admin Only)

These endpoints require a valid `accessToken` from an **admin** user.

*   **`POST /api/role/`**
    Create a new role. Requires `name` in the request body.

    ```bash
    curl -X POST http://localhost:3000/api/role/ \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer admin_access_token' \
      -d '{
        "name": "moderator"
      }'
    ```

*   **`PUT /api/role/`**
    Edit a role. Requires role details to update in the request body.

    ```bash
    curl -X PUT http://localhost:3000/api/role/ \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer admin_access_token' \
      -d '{
        "name": "moderator",
        "newFieldName": "newValue"
        # ... other fields to update
      }'
    ```

*   **`GET /api/role/:id`**
    Get information about a specific role by ID. Requires admin `accessToken`.

    ```bash
    curl -X GET "http://localhost:3000/api/role/role_id_here" \
      -H 'Authorization: Bearer admin_access_token'
    ```

*   **`GET /api/role/`**
    List all roles. Requires admin `accessToken`.

    ```bash
    curl -X GET http://localhost:3000/api/role/ \
      -H 'Authorization: Bearer admin_access_token'
    ```

*   **`DELETE /api/role/`**
    Delete a role. Requires role details in the request body.

    ```bash
    curl -X DELETE http://localhost:3000/api/role/ \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer admin_access_token' \
      -d '{
        "name": "moderator"
      }'
    ```

## JWT Authentication (Access & Refresh Tokens)

This project implements JWT authentication using a pair of tokens:

*   **Access Token:** Short-lived (15 minutes). Used to access protected API endpoints.
*   **Refresh Token:** Longer-lived (7 days, managed by database TTL). Used to obtain a new pair of Access and Refresh Tokens when the Access Token expires.

Include the Access Token in the `Authorization: Bearer <token>` header for requests to protected endpoints.

When an Access Token expires, the server will likely return a 401 Unauthorized response (with a specific message). Based on the current routing, the `/api/user/refresh-token` endpoint is intended to handle token refreshing using a Refresh Token, but its implementation might be incorrect. Clients would typically use their Refresh Token to call this endpoint to get a new pair of tokens.

## Database Structure

This project uses MongoDB and interacts with the following collections:

*   `users`: Stores user accounts (username, password hash, role, HWID, access expiry, etc.). Does **not** store refresh tokens.
*   `keys`: Stores register keys, their usage status, and the access duration/type (`durationDays`, `isLifetime`) they provide.
*   `tokens`: Stores refresh tokens for active user sessions. Each document links a `refreshToken` string to a `userId` and has a time-to-live (TTL) index to automatically handle expiry.

Make sure your MongoDB instance is running and accessible via the `MONGO_URI` in your `.env` file.
