NexGenStudioDev/FastKit

Build Pluggable & Modular User Feature Module

オープン

#8 opened on 2025/06/27

 (0 件のコメント) (0 件のリアクション) (0 人の担当者)TypeScript (0 件のフォーク)auto 404
TypeScriptbackenddocumentationenhancementgood first issuenpm

Repository metrics

Stars
 (1 個のスター)
PR merge metrics
 (PR metrics pending)

説明

🧑‍💼 User Feature Module (FastKit-style)

🧩 Description

Build a fully modular, pluggable, and class-based User module for managing user profiles. This module should expose a UserController class that can be directly used in any route with bind-safe methods.

Developers should be able to:

  • Read, update, and delete user profiles

  • Use class-based controller and service

  • Validate user profile updates

  • Plug in the controller with any route setup


🧱 Why This Is Important

  • 🎯 Every real app requires user management

  • 🔁 Helps reuse clean logic across many services

  • 🧼 Avoids repeating profile logic in multiple places

  • 🧪 Makes it easy to test and customize per project

  • 📦 Ready for monorepos, SaaS platforms, or admin panels


🟢 Difficulty Level: Beginner → Intermediate

Requires understanding of:

  • Express middleware and routing

  • Modular folder structuring

  • Class-based architecture

  • Clean code separation (controller, service, validators)


✅ Tasks


1. 🧱 User Model (User.model.ts)

[ ] Define schema or model fields:

  • id: string

  • name: string

  • email: string

  • avatar?: string

  • role_id?: string

  • [ ] Make it DB-agnostic (can use Mongoose/Prisma/In-Memory)

2. 📜 Validators (User.validators.ts)

  • [ ] Create validation schemas for:

  • updateUser (e.g., name/email only)

  • changePassword (if applicable)

  • [ ] Use Zod or Joi

  • [ ] Export as middleware

3. 🔧 Service Layer (User.service.ts)

  • [ ] Business logic methods:

  • getUserById(id)

  • getAllUsers()

  • updateUser(id, payload)

  • deleteUser(id)

  • [ ] Should return plain objects or throw errors

  • No Express code


4. 🎮 Controller (User.controller.ts)

  • [ ] Class UserController with bind-safe methods:

  • getUserById(req, res)

  • getAllUsers(req, res)

  • updateUser(req, res)

  • deleteUser(req, res)

  • [ ] Use corresponding service methods

  • [ ] Handle HTTP response formatting

router.get('/user/:id', userController.getUserById);

5. 🛡️ Middleware (Optional) (User.middleware.ts)

  • [ ] Add auth middleware placeholder like:

  • verifyUserOwnsAccountOrIsAdmin


6. ❗ Constants (User.constant.ts)

  • [ ] Add standard messages and error codes:
export const USER_ERRORS = {
  NOT_FOUND: 'User not found.',
  UPDATE_FAILED: 'Failed to update user.',
  UNAUTHORIZED: 'You are not allowed to access this user.'
};

7. 📘 README.md

Show how to:

  • Import and use UserController

  • Add validators before controller

  • Customize the logic

  • Keep usage copy-paste-ready

8. 🧪 Demo (User.demo.ts)

  • [ ] Use all 4 main methods:

  • Get single user

  • Get all users

  • Update a user

  • Delete a user


📁 Final Folder Structure

src/
└── features/
    └── User/
        └── v1/
            ├── User.controller.ts         # Main class
            ├── User.service.ts            # Business logic
            ├── User.validators.ts         # Validation middleware
            ├── User.constant.ts           # Error/status constants
            ├── User.utils.ts         # Utility Class 
            ├── User.model.ts              # Mongoose/DB schema
            ├── User.middleware.ts         # Optional auth/match check
            ├── User.demo.ts               # Sample usage
            └── README.md                  # Docs & setup guide


🎯 Expected Outcome

[x] Reusable UserController class

[x] Standard get, update, delete operations

[x] Middleware-friendly (e.g. verifyToken)

[x] Clean separation of service and controller logic

[x] Easily integrated with any Express project


🔐 Example Route Usage

import { verifyToken } from '../auth/Auth.middleware';
import { UserController, validateUpdateUser } from 'fastkit-user';



router.get('/users/:id', verifyToken, userController.getUserById);
router.get('/users', verifyToken, UserController.getAllUsers);
router.put('/users/:id', verifyToken, validateUpdateUser, UserController.updateUser);
router.delete('/users/:id', verifyToken, userController.deleteUser);


🙋🏻‍♂️ Looking For

Contributions to:

  • Add password update/reset endpoint

  • Support profile image upload or avatar management

  • Add admin filters: search by role, status, etc.

  • Extend with pagination and soft

コントリビューターガイド