</>Mohit Anand
← Back to projects

shuushoku-assen

Placement portal streamlining hiring — drives, applications, offers, analytics and PDF reports.

GitHubStack:FlaskVueCeleryRedisSQLite

Shushoku Assen

Backend CI

A placement portal that streamlines the hiring process, helping companies find the best talent and students the best opportunities.

[!NOTE] This project is kind of like Linkedin - Social Networking for internal placements in college.

Highlights

Tech Stack

Backend (backend/)

Frontend (frontend/)

Project Structure

.
├── backend/                       # Flask API + Celery tasks
│   ├── app.py                     # App factory, blueprints, celery schedule
│   ├── celery_config.py           # Broker / result backend config
│   ├── pyproject.toml             # Python deps (uv)
│   └── application/
│       ├── api/                   # Blueprints: auth, utils, student, company,
│       │                          #   drive, applied, placement, analytics, download
│       ├── models.py              # SQLAlchemy models
│       ├── schema.py              # Marshmallow schemas
│       ├── tasks.py               # Celery tasks (reports, mail, webhooks, cleanup)
│       ├── mail.py                # SMTP mail helper
│       ├── dummy_data.py          # Seeds DB with demo data on startup
│       └── factory.py             # Extension init + role_required decorator
└── frontend/                      # Vue 3 + Vite SPA
    ├── index.html
    └── src/
        ├── router.js              # Vue Router routes
        ├── stores/auth.js         # Pinia auth store
        ├── axios.js               # Axios instance with CSRF/cookie handling
        └── components/            # Views & reusable components

Getting Started

Prerequisites

Docker (full stack)

One command builds and starts every service — Redis, the Flask API, Celery worker + beat, and the frontend (production build served by nginx):

docker compose up --build
Service URL
Frontend http://localhost:5173
API http://localhost:3000
Swagger http://localhost:3000/swagger-ui

How it works:

Useful commands:

docker compose logs -f backend    # follow one service
docker compose down               # stop (named volumes persist)
docker compose down -v            # stop and wipe the database + reports

Backend (local development)

cd backend
uv sync                  # install dependencies
uv run python app.py     # start the API on http://localhost:3000

Celery (worker + beat)

# terminal 1 - worker
uv run celery -A app.celery worker --loglevel=info

# terminal 2 - beat (scheduled tasks)
uv run celery -A app.celery beat --loglevel=info

Scheduled tasks (defined in app.py):

Mail sink

Report emails use SMTP on localhost:1025 (see application/mail.py). Point a local mail catcher like MailHog or aiosmtpd at that port to inspect outgoing mail.

Google Chat webhook

The drive_notification task posts to a Google Chat webhook when a drive is created. Set the webhook URL in backend/application/tasks.py.

Frontend

cd frontend
npm install
npm run dev      # start the Vite dev server on http://localhost:5173

The Vite dev server proxies /api and /auth to the backend at http://127.0.0.1:3000 (see frontend/vite.config.js).

Demo Accounts

Seeded by backend/application/dummy_data.py, password password for all:

Role Email Notes
Admin user@admin.com Full access
Student user@student1.com Branch: Computer Science
Student user@student2.com Branch: Data Science
Student user@student3.com Branch: Mechanical Engineering
Company hr@techcorp.com Approved — can host drives
Company hr@financeltd.com Pending approval
Company hr@badcompany.com Rejected

Entities

Resources

API Endpoints

All endpoints except POST /auth/v1/login, POST /auth/v1/logout, POST /api/v1/students/ and POST /api/v1/company/ require authentication (JWT). * indicates any authenticated user.

Auth — prefix /auth/v1

Utilities — prefix /api/v1/utils

Students — prefix /api/v1/students

Companies — prefix /api/v1/company

Drives — prefix /api/v1/drives

Applications — prefix /api/v1/applications

Placements — prefix /api/v1/placements

Analytics — prefix /api/v1/analytics

Downloads — prefix /api/v1/downloads

Report endpoints dispatch a Celery task and return a task id; fetch the finished file from GET /api/v1/downloads/<id>.

Models and Fields

Base Model (abstract)

Utility Models

User Models

Operational Models