Updated to using managed types instead of
hard coded ones.
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
# MamadApp
|
||||
|
||||
Emergency tracker web app with role-based admin management and hierarchical user organization.
|
||||
|
||||
## Overview
|
||||
MamadApp tracks user status (shelter and activity) and provides an admin console to manage users across a hierarchy:
|
||||
Field > Department > Team > Person. Admins can manage only the scope they are assigned to.
|
||||
|
||||
## Requirements
|
||||
- Node.js 18+
|
||||
- MySQL 8+
|
||||
- npm (or pnpm)
|
||||
|
||||
## Repository Layout
|
||||
- `app/` Next.js app routes (UI + API)
|
||||
- `components/` shared UI components
|
||||
- `hooks/` client hooks (real-time polling)
|
||||
- `lib/` database and auth utilities
|
||||
- `scripts/` database setup, migration, and maintenance
|
||||
- `types/` shared TypeScript types
|
||||
|
||||
## Configuration
|
||||
1) Copy `config.json.template` to `config.json`
|
||||
2) Update database settings:
|
||||
- `database.host`
|
||||
- `database.user`
|
||||
- `database.password`
|
||||
- `database.database`
|
||||
|
||||
## Database Setup
|
||||
|
||||
Fresh install:
|
||||
1) (Optional) Create database user:
|
||||
- Run `scripts/setup-database-user.sql` as MySQL root.
|
||||
2) Create schema:
|
||||
- Run `scripts/schema.sql`
|
||||
|
||||
Existing database:
|
||||
1) Run `scripts/migrate-managed-types.sql`
|
||||
- Adds `managed_types` table
|
||||
- Converts `users.field/department/team` to `VARCHAR`
|
||||
- Seeds managed types and hierarchy from existing user data
|
||||
|
||||
See `scripts/README.md` for details and archived migrations.
|
||||
|
||||
## Running the App
|
||||
Local development:
|
||||
- `npm install`
|
||||
- `npm run dev`
|
||||
|
||||
Production build:
|
||||
- `npm run build`
|
||||
- `npm run start`
|
||||
|
||||
## Admin Roles and Permissions
|
||||
|
||||
Global admin:
|
||||
- Full access to all fields/departments/teams
|
||||
- Can create, rename, and delete managed types
|
||||
- Can move any user
|
||||
|
||||
Field admin (Field A):
|
||||
- Can manage users in Field A only
|
||||
- Can create/rename/delete departments and teams under Field A
|
||||
- Can move users within Field A (including across departments/teams)
|
||||
|
||||
Department admin (Dept X in Field A):
|
||||
- Can manage users in Dept X only
|
||||
- Can create/rename/delete teams under Dept X
|
||||
- Can move users within Dept X
|
||||
|
||||
Team admin (Team Y in Dept X):
|
||||
- Can manage users in Team Y only
|
||||
- Cannot create/rename/delete managed types
|
||||
- Can only move users within Team Y
|
||||
|
||||
## Managed Types (Fields, Departments, Teams)
|
||||
Managed types are stored in `managed_types` with hierarchy:
|
||||
- `field` has no parent
|
||||
- `department` parent = field
|
||||
- `team` parent = department
|
||||
|
||||
UI behavior:
|
||||
- Managed types list is filtered based on the admin scope.
|
||||
- Department and team creation requires selecting a parent.
|
||||
- Rename updates both `managed_types` and existing user rows.
|
||||
- Deleting is blocked if users or child types still reference the value.
|
||||
|
||||
## Database Tables
|
||||
|
||||
`users` (core):
|
||||
- identity: `national_id`, `name`
|
||||
- auth: `password`, `must_change_password`, `password_changed_at`
|
||||
- scope: `field`, `department`, `team`
|
||||
- role: `role`, `is_admin`
|
||||
- status: `in_shelter`, `last_updated`
|
||||
- safety: `lock_status`
|
||||
|
||||
`managed_types`:
|
||||
- `type`: `field | department | team`
|
||||
- `name`
|
||||
- `parent_id` for hierarchy
|
||||
|
||||
`admin_actions`:
|
||||
- Tracks resets, password resets, and role changes
|
||||
|
||||
## Common Tasks
|
||||
|
||||
Add a new field/department/team:
|
||||
- Use the Admin UI (global/field/department admins only).
|
||||
- Department/team creation requires selecting a parent.
|
||||
|
||||
Move a user:
|
||||
- Use the Admin UI and the edit (pencil) button in user tables.
|
||||
- User movement is restricted by admin scope.
|
||||
|
||||
Rename a type:
|
||||
- Use the managed types UI. Rename cascades to users.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Managed types not appearing:
|
||||
- Ensure `managed_types` table exists.
|
||||
- Run `scripts/migrate-managed-types.sql`.
|
||||
|
||||
Cannot delete a type:
|
||||
- Users or child types still reference it.
|
||||
- Reassign users and delete children first.
|
||||
|
||||
Permissions denied:
|
||||
- Verify the admin role and assigned scope (field/department/team values).
|
||||
|
||||
## Notes
|
||||
- Admin actions are logged in `admin_actions`.
|
||||
- Managed types are hierarchical and validated in API routes.
|
||||
Reference in New Issue
Block a user