Z User eafbdae66a fix(session10): code review fixes — architecture violations + consistency + dead code
Architecture fixes:
- CCA4_0100_pg: removed SecurityContext.getRoleCode(req) from controller (architecture
  violation — controller should not access security context beyond requireLogin).
  Removed 'currentRoleCode' model attribute. HTML btnCreate now always visible —
  Filter handles permission via SYS_ROLE_FUNCTION.
- CCA4_0100.html: removed ROLE_CODE check + display:none on btnCreate. Nút Create
  luôn hiện — USER sẽ bị 403 khi gọi API create.

Consistency fixes:
- MenuService.str(): changed return null → return '' (consistent with all 33 other str() helpers)
- CCA8_0100_mod.str(): changed return null → return '' (consistent)
- CCA1_0200.html: removed UPPERCASE key fallbacks (data.MESSAGE_ID, r.CNT) — DataSet
  always returns lowercase keys, these were dead code branches.

Code cleanup:
- CCA3_0100_mod.get(): removed convId2 workaround — reuse :convId (DataSet allows same
  param name multiple times in one SQL).
- CCA4_0100_mod.get(): same convId2 cleanup.
- ChatMessageController.presence(): implemented actual heartbeat — update CC_PRESENCE
  + SYS_USER.LAST_SEEN_AT (was dead code with TODO comment).
- ChatWebSocketService: added getRegistry() getter for ChatMessageController.

Test results (no regression):
- CC/A1: 14/14 PASS
- CC/A4+A5: 23/23 PASS
- CC/A6+A8: 22/22 PASS
- Total: 59/59 PASS
- Build: SUCCESS
2026-08-10 14:47:14 +00:00

ChimCuGay — Telegram-like Fullstack Chat System

Hệ thống Web Chat Fullstack giống Telegram, viết bằng Java Spring Boot, tuân thủ tuyệt đối kiến trúc ChimCuGay Skills.

Mục lục

  1. Giới thiệu
  2. Công nghệ
  3. Cấu trúc Project
  4. Quickstart
  5. Cấu hình
  6. Tài khoản mặc định
  7. Module & Quyền
  8. Roadmap & Trạng thái
  9. Quy trình đóng góp

Giới thiệu

ChimCuGay là hệ thống chat fullstack (Web) có thiết kế tương đương Telegram Web, với mục tiêu:

  • Hiệu năng cao, có khả năng mở rộng
  • Module hóa rõ ràng theo convention ChimCuGay (controller / trx / mod / html)
  • RBAC qua Filter, menu động từ SYS_FUNCTION
  • Không sử dụng JPA / Repository / Hibernate — toàn bộ DB access qua DataSetRegistry

Công nghệ

Thành phần Công nghệ
Backend Java 21 + Spring Boot 3.3
Web Spring MVC + Embedded Tomcat
Security Spring Security + JWT + BCrypt
Realtime Spring WebSocket + STOMP + SockJS
Template Thymeleaf
Database MySQL 8.x
DB Access DataSetRegistry (KHÔNG JPA)
Build Maven

Cấu trúc Project

chimcugay/
├── pom.xml
├── README.md
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── skills/
│   └── skill.md                  ← Architecture rules (BẮT BUỘC đọc)
├── PROMPT.md                     ← Yêu cầu dự án
├── ROADMAP.md                    ← Lộ trình + trạng thái (xem trước khi code)
├── sql/
│   ├── init.sql                  ← Schema MySQL
│   └── seed.sql                  ← Dữ liệu SYS_FUNCTION, quyền, config mặc định
├── work_reports/
│   └── report_YYYY-MM-DD_sessionN.md   ← Báo cáo theo session
└── src/main/
    ├── java/com/chimcugay/io/vn/
    │   ├── Application.java
    │   ├── config/                ← Security, WebSocket, AppConfig, SeedRunner
    │   ├── constant/              ← SystemConstants
    │   ├── controller/
    │   │   ├── BaseController.java
    │   │   ├── ZZ/A0/             ← Mỗi function 1 folder: ZZA0_XXXX
    │   │   │   ├── ZZA0_0001/ZZA0_0001_pg.java
    │   │   │   └── ...
    │   │   └── CC/A0/
    │   ├── api/                   ← trx + mod
    │   │   ├── ZZ/A0/ZZA0_XXXX/
    │   │   │   ├── ZZA0_XXXX_trx.java
    │   │   │   └── ZZA0_XXXX_mod.java
    │   │   └── CC/A0/CCA0_XXXX/
    │   ├── filter/
    │   │   └── MultiSystemPermissionFilter.java
    │   ├── security/              ← JwtService, SecurityContext, PasswordEncoder
    │   ├── service/               ← DataSet, DataSetRegistry, MenuService, UploadService
    │   ├── exception/             ← BusinessException, GlobalExceptionHandler
    │   └── util/                  ← ApiResponse
    └── resources/
        ├── application.yml
        ├── application-prod.yml
        ├── static/{css,js,img}/
        └── templates/
            ├── layout/main.html   ← Layout chung (sidebar động từ SYS_FUNCTION)
            ├── error/error.html
            ├── ZZ/A0/ZZA0_XXXX/*.html
            └── CC/A0/CCA0_XXXX/*.html

Quickstart

Yêu cầu

  • Java 21+
  • Maven 3.8+
  • MySQL 8.x

Chạy local

# 1. Tạo database và seed
mysql -u root -p < sql/init.sql
mysql -u root -p chimcugay < sql/seed.sql

# 2. Cấu hình (copy và chỉnh sửa nếu cần)
cp .env.example .env

# 3. Build & run
mvn clean install
mvn spring-boot:run

# Hoặc chạy class Application trong IDE

Truy cập: http://localhost:8080

Chạy bằng Docker

docker compose up -d --build

Service:

Cấu hình

Toàn bộ cấu hình trong application.yml, override bằng env vars:

Env Mặc định Mô tả
DB_HOST localhost MySQL host
DB_PORT 3306 MySQL port
DB_NAME chimcugay Tên database
DB_USER root MySQL user
DB_PASSWORD root MySQL password
JWT_SECRET (xem .env.example) JWT signing secret (≥32 bytes)
UPLOAD_DEFAULT LOCAL LOCAL / S3 / MINIO
UPLOAD_LOCAL_DIR ./uploads Thư mục upload local
UPLOAD_PUBLIC_URL http://localhost:8080/static/uploads URL public cho file upload
SPRING_PROFILES_ACTIVE dev dev / prod

Tài khoản mặc định

Sau khi chạy seed (tự động khi app khởi động lần đầu), hệ thống có sẵn:

Username Password Role
admin admin123 SUPER_ADMIN

Ngoài ra còn 2 role mặc định (chưa gán user): ADMIN, USER.

Module & Quyền

ZZ — Hệ thống Quản trị (Admin)

Function ID Tên Mô tả
ZZA0_0001 Đăng nhập Login/Logout/Refresh Token (public, không có menu)
ZZA0_0100 Quản lý User CRUD user, reset password, lock/unlock
ZZA0_0200 Quản lý Role CRUD role
ZZA0_0300 Quản lý Function CRUD SYS_FUNCTION
ZZA0_0400 Phân quyền Gán ROLE ↔ FUNCTION
ZZA0_0500 Dashboard Thống kê hệ thống
ZZA0_0600 Cấu hình Upload CRUD SYS_UPLOAD_CONFIG

CC — Hệ thống Chat

Function ID Tên Mô tả
CCA0_0100 Tài khoản chat CRUD CC_CHAT_ACCOUNT
CCA0_0200 Phân quyền chat CRUD CC_CHAT_PERMISSION theo role
CCA0_0300 Cấu hình chat CRUD CC_CHAT_CONFIG

Phân quyền mặc định (sau seed)

Role Quyền
SUPER_ADMIN Toàn quyền ZZ + CC
ADMIN Toàn quyền ZZ + CC, trừ ZZA0_0300 (Function) và ZZA0_0400 (Permission)
USER Chỉ Dashboard + CCA0_0100 (Chat Account của mình) + CCA0_0300 (Chat Config xem)

Roadmap & Trạng thái

Xem chi tiết trong ROADMAP.md.

Tóm tắt trạng thái hiện tại (Session 1):

  • Core infrastructure: HOÀN THÀNH (DataSetRegistry, Filter, Menu, JWT, Upload, WebSocket)
  • ZZ module A0: HOÀN THÀNH 7/7 function (Login, User, Role, Function, Permission, Dashboard, Upload Config)
  • CC module A0: HOÀN THÀNH 3/3 function (Chat Account, Chat Permission, Chat Config)
  • CC module A1 (Chat realtime): CHƯA BẮT ĐẦU (cần làm tiếp ở session 2)
  • Chat features (1-1, group, channel, message, reaction...): CHƯA BẮT ĐẦU

Quy trình đóng góp

Khi tiếp tục phát triển (cho AI/agent kế tiếp):

  1. Đọc theo thứ tự bắt buộc:
    • skills/skill.md — architecture rules
    • ROADMAP.md — trạng thái + roadmap
    • Báo cáo session gần nhất trong work_reports/
  2. Tuân thủ 100% Skills:
    • Controller (_pg): chỉ mapping URL + trả HTML
    • trx: chỉ nhận request + validate + gọi mod
    • mod: toàn bộ business
    • Dữ liệu: chỉ qua DataSetRegistry (KHÔNG JPA/Repository)
    • Quyền: chỉ kiểm tra ở MultiSystemPermissionFilter
    • Menu: chỉ render từ SYS_FUNCTION
  3. Mỗi module mới sinh đủ: _pg + _trx + _mod + .html + INSERT SYS_FUNCTION + (nếu cần) INSERT SYS_ROLE_FUNCTION
  4. Sau mỗi session: append báo cáo vào work_reports/report_YYYY-MM-DD_sessionN.md và cập nhật ROADMAP.md

Quy ước function

ZZA0_0100   ← FUNCTION_CODE (có dấu _)
ZZA00100    ← FUNCTION_ID   (bỏ dấu _)
/api/ZZ/A0/ZZA0_0100/prompt?TxRequest=ACTION   ← INVOKED_URL
/ZZ/A0/ZZA0_0100                                  ← MENU_URL
S
Description
ChimCuGay - Telegram-like Fullstack Chat System (Java Spring Boot)
Readme
656 KiB
Languages
Java 62%
HTML 31.9%
Python 5%
JavaScript 0.5%
Shell 0.4%
Other 0.1%