# 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.