Activity Inventory - Questionnaire Voting App
A web application that allows admins to create shareable questionnaires where users can add activities and vote on them using upvotes and downvotes.
Tech Stack
- Frontend: React 18, TypeScript, Vite, Tailwind CSS
- Backend: Express.js, TypeScript
- Database: SQLite with
better-sqlite3 - Containerization: Docker with multi-stage build
Features
- Admin Dashboard: Create and manage questionnaires with unique shareable URLs
- User Management: Add/remove admin users and change passwords
- Public Voting: Share questionnaire URLs for users to add activities and vote
- Upvote/Downvote System: Users can upvote or downvote activities
- Comments: Users can comment on activities and reply to comments
- Name Persistence: Visitor names are stored in cookies for 30 days
- Docker Support: Easy deployment with Docker and docker-compose
Quick Start with Docker
-
Clone the repository and navigate to the project directory
-
Start the application:
docker-compose up -d --build -
Access the app at
http://localhost:4000 -
Login with default credentials:
- Username:
admin - Password:
admin123
- Username:
-
Create a questionnaire and share the unique URL with participants
Development Setup
-
Install dependencies:
npm install -
Start the development servers (frontend + backend):
npm run dev -
Access the app at
http://localhost:5177(Vite dev server)- API requests are proxied to
http://localhost:4000
- API requests are proxied to
Configuration
Environment variables can be set in docker-compose.yml or via a .env file:
| Variable | Description | Default |
|---|---|---|
PORT |
Server port | 4000 |
SESSION_SECRET |
Secret for session encryption | super-secret-session-key-change-me |
DB_PATH |
SQLite database path | /app/data/questionnaire.db |
DEFAULT_ADMIN_USER |
Default admin username | admin |
DEFAULT_ADMIN_PASS |
Default admin password | admin123 |
Project Structure
questionnaire/
├── docker-compose.yml # Docker Compose configuration
├── Dockerfile # Multi-stage Docker build
├── package.json # Node.js dependencies
├── vite.config.ts # Vite configuration
├── tailwind.config.js # Tailwind CSS configuration
├── tsconfig.json # TypeScript configuration
├── index.html # HTML entry point
├── server/ # Express backend (TypeScript)
│ ├── index.ts # Server entry point
│ ├── database.ts # SQLite database operations
│ ├── middleware/
│ │ └── auth.ts
│ └── routes/
│ ├── admin.ts
│ ├── auth.ts
│ └── questionnaire.ts
└── src/ # React frontend (TypeScript)
├── main.tsx # React entry point
├── App.tsx # App router
├── index.css # Tailwind imports
├── context/
│ └── AuthContext.tsx
├── components/
│ ├── AdminLayout.tsx
│ └── ProtectedRoute.tsx
└── pages/
├── Login.tsx
├── Dashboard.tsx
├── QuestionnaireForm.tsx
├── QuestionnaireDetail.tsx
├── Users.tsx
├── ChangePassword.tsx
├── PublicQuestionnaire.tsx
└── NotFound.tsx
API Endpoints
Public Routes
GET /api/q/:uuid- Get questionnaire dataPOST /api/q/:uuid/set-name- Set visitor namePOST /api/q/:uuid/activities- Add an activityPOST /api/q/:uuid/activities/:id/vote- Vote on an activityGET /api/q/:uuid/activities/:id/comments- Get commentsPOST /api/q/:uuid/activities/:id/comments- Add a comment
Auth Routes
GET /api/auth/status- Check authentication statusPOST /api/auth/login- LoginPOST /api/auth/logout- Logout
Admin Routes (requires authentication)
GET /api/admin/questionnaires- List all questionnairesPOST /api/admin/questionnaires- Create questionnaireGET /api/admin/questionnaires/:id- Get questionnaire detailsPUT /api/admin/questionnaires/:id- Update questionnaireDELETE /api/admin/questionnaires/:id- Delete questionnaireDELETE /api/admin/activities/:id- Delete activityGET /api/admin/users- List all usersPOST /api/admin/users- Create userDELETE /api/admin/users/:id- Delete userPOST /api/admin/change-password- Change password
Security Notes
- Change the default admin password immediately after first login
- Set a strong
SESSION_SECRETin production - The application uses bcrypt for password hashing
- Session cookies are HTTP-only
License
MIT
Description
Languages
TypeScript
96.8%
HTML
0.8%
Dockerfile
0.8%
JavaScript
0.8%
Shell
0.5%
Other
0.3%