# Microserver - Node.js, Express.js, WebSockets, and Bun.js

This Microserver is built with **Node.js**, **Express.js**, **WebSockets**, and **Bun.js** to streamline the development of modern web applications. It incorporates an organized directory structure for managing API endpoints, request handlers, and database models.

---

## Features

- **Node.js and Express.js**: Core technologies for building the server.
- **WebSockets**: Integrated support for real-time communication.
- **Bun.js**: High-performance runtime for modern JavaScript.
- **Sequelize ORM**: Simplifies database interaction with models and migrations.
- **Automatic API Endpoint Generation**: Auto-creates endpoints from files in the `/routes` directory.

---

## Directory Structure

```
.
├── /routes          # API endpoint definitions
├── /controller      # Request handler logic
├── /models          # Sequelize models for database interaction
├── /utils           # Utility functions and helpers
├── app.ts           # Main application entry point
├── db.config.ts     # Database Connection
├── package.json     # Project dependencies and scripts
```

### `/routes`
Each file in the `/routes` directory corresponds to an API endpoint. The file name defines the route path, and its exported module maps to request methods (e.g., `GET`, `POST`, `PUT`, `DELETE`).

Example: `/routes/user.js`
```js
module.exports = {
  'GET /': 'controller.userController.getAllUsers',
  'POST /': 'controller.userController.createUser',
};
```

### `/controller`
Request handlers for the routes. Each controller handles business logic and interacts with models.

Example: `/controller/userController.js`
```js
const User = require('../models/User');

module.exports = {
  getAllUsers: async (req, res) => {
    const users = await User.findAll();
    res.json(users);
  },

  createUser: async (req, res) => {
    const user = await User.create(req.body);
    res.status(201).json(user);
  },
};
```

### `/models`
Sequelize ORM models representing database tables. Models include definitions for fields, data types, and relationships.

Example: `/models/User.js`
```js
const { Model, DataTypes } = require('sequelize');
const sequelize = require('../config/database');

class User extends Model {}

User.init(
  {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
  },
  { sequelize, modelName: 'User' }
);

module.exports = User;
```

---

## Getting Started

### Prerequisites
Ensure you have the following installed:
- **Node.js** (v16 or higher)
- **Bun.js** (latest version)
- **Sequelize CLI** for managing migrations

### Start a new project using @ccci/run (Recommended)
   ```bash
   bunx @ccci/run init <projectName>
   ```

### Install as a dependency in an existing project
   ```bash
   bun install @ccci/micro-server
   ```
---

## Usage

### Adding an API Endpoint
1. Create a new file in `/routes`, e.g., `/routes/product.js`.
2. Define route methods and associate them with controllers.

### Adding a Model
1. Create a new file in `/models`, e.g., `/models/Product.js`.
2. Define the model fields and configurations.
3. Generate a migration using Sequelize CLI to apply the model to the database.

### Real-Time Communication
Use WebSockets for real-time communication. The WebSocket server is integrated into the application for managing connections and events.

---

## Scripts
- `bun run app.js`: Start the server
- `npx sequelize-cli db:migrate`: Run database migrations
- `npx sequelize-cli db:seed`: Seed the database (optional)

---

## License
This project is licensed under the MIT License.

---

## Contributing
Contributions are welcome! Feel free to submit a pull request or open an issue for suggestions or bug reports.

