2026-01-06 01:54:23 +01:00

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

  1. Clone the repository and navigate to the project directory

  2. Start the application:

    docker-compose up -d --build
    
  3. Access the app at http://localhost:4000

  4. Login with default credentials:

    • Username: admin
    • Password: admin123
  5. Create a questionnaire and share the unique URL with participants

Development Setup

  1. Install dependencies:

    npm install
    
  2. Start the development servers (frontend + backend):

    npm run dev
    
  3. Access the app at http://localhost:5177 (Vite dev server)

    • API requests are proxied to http://localhost:4000

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 data
  • POST /api/q/:uuid/set-name - Set visitor name
  • POST /api/q/:uuid/activities - Add an activity
  • POST /api/q/:uuid/activities/:id/vote - Vote on an activity
  • GET /api/q/:uuid/activities/:id/comments - Get comments
  • POST /api/q/:uuid/activities/:id/comments - Add a comment

Auth Routes

  • GET /api/auth/status - Check authentication status
  • POST /api/auth/login - Login
  • POST /api/auth/logout - Logout

Admin Routes (requires authentication)

  • GET /api/admin/questionnaires - List all questionnaires
  • POST /api/admin/questionnaires - Create questionnaire
  • GET /api/admin/questionnaires/:id - Get questionnaire details
  • PUT /api/admin/questionnaires/:id - Update questionnaire
  • DELETE /api/admin/questionnaires/:id - Delete questionnaire
  • DELETE /api/admin/activities/:id - Delete activity
  • GET /api/admin/users - List all users
  • POST /api/admin/users - Create user
  • DELETE /api/admin/users/:id - Delete user
  • POST /api/admin/change-password - Change password

Security Notes

  • Change the default admin password immediately after first login
  • Set a strong SESSION_SECRET in production
  • The application uses bcrypt for password hashing
  • Session cookies are HTTP-only

License

MIT

Description
No description provided
Readme 264 KiB
Languages
TypeScript 96.8%
HTML 0.8%
Dockerfile 0.8%
JavaScript 0.8%
Shell 0.5%
Other 0.3%