Skip to content

Repository files navigation

Church Management System API

A REST API for managing church members, households, groups, services, and attendance. Built with Rust, Axum, and PostgreSQL.

Tech Stack

  • Framework: Axum 0.7
  • Database: PostgreSQL 16
  • ORM: SQLx (compile-time checked queries)
  • Authentication: JWT with refresh tokens
  • Password Hashing: Argon2

Project Structure

cms-api/
├── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Module exports, AppState
│ ├── config.rs # Environment configuration
│ ├── errors.rs # Unified error handling
│ ├── routes/ # HTTP handlers
│ │ ├── auth.rs # Login, refresh, logout
│ │ ├── users.rs # Admin user management
│ │ ├── members.rs # Church member CRUD + CSV import
│ │ ├── households.rs # Household CRUD + member linking
│ │ ├── groups.rs # Groups/ministries CRUD
│ │ ├── services.rs # Church services CRUD
│ │ └── attendance.rs # Check-in, bulk check-in
│ ├── services/ # Business logic layer
│ ├── repositories/ # Database queries
│ ├── models/ # Database models
│ ├── dto/ # Request/Response types
│ └── middleware/ # Auth extractors
├── migrations/ # SQLx database migrations
├── tests/ # Integration tests
├── Dockerfile # Production build
├── Dockerfile.dev # Development with hot reload
├── docker-compose.yml # Production setup
├── docker-compose.dev.yml # Development setup
└── docker-compose.test.yml # Test setup

Features

MVP Entities

  • Users: Admin accounts with roles (super_admin, admin, staff)
  • Members: Church members with soft delete
  • Households: Family groupings with member linking
  • Groups: Ministries, committees, cell groups (configurable type)
  • Services: Church services/events
  • Attendance: Check-in tracking with bulk support

Authentication

  • JWT access tokens (configurable expiration)
  • Refresh token rotation
  • Role-based access control
  • Password hashing with Argon2

Additional Features

  • CSV bulk import for members
  • Pagination on all list endpoints
  • Search/filter support
  • Soft delete for members

API Endpoints

Authentication

MethodEndpointDescription
POST/api/v1/auth/loginLogin, returns tokens
POST/api/v1/auth/refreshRefresh access token
POST/api/v1/auth/logoutRevoke refresh token

Users (Admin only)

MethodEndpointDescription
GET/api/v1/usersList users
POST/api/v1/usersCreate user
GET/api/v1/users/:idGet user
PATCH/api/v1/users/:idUpdate user
DELETE/api/v1/users/:idDelete user

Members

MethodEndpointDescription
GET/api/v1/membersList members (paginated)
POST/api/v1/membersCreate member
POST/api/v1/members/importBulk import from CSV
GET/api/v1/members/:idGet member
PATCH/api/v1/members/:idUpdate member
DELETE/api/v1/members/:idSoft delete member
GET/api/v1/members/:id/attendanceMember's attendance
GET/api/v1/members/:id/groupsMember's groups

Households

MethodEndpointDescription
GET/api/v1/householdsList households
POST/api/v1/householdsCreate household
GET/api/v1/households/:idGet household
PATCH/api/v1/households/:idUpdate household
DELETE/api/v1/households/:idDelete household
GET/api/v1/households/:id/membersList members
PUT/api/v1/households/:id/members/:midLink member
DELETE/api/v1/households/:id/members/:midUnlink member

Groups

MethodEndpointDescription
GET/api/v1/groupsList groups
POST/api/v1/groupsCreate group
GET/api/v1/groups/:idGet group
PATCH/api/v1/groups/:idUpdate group
DELETE/api/v1/groups/:idDelete group
GET/api/v1/groups/:id/membersList members
POST/api/v1/groups/:id/members/:midAdd member
DELETE/api/v1/groups/:id/members/:midRemove member

Services

MethodEndpointDescription
GET/api/v1/servicesList services
POST/api/v1/servicesCreate service
GET/api/v1/services/:idGet service
PATCH/api/v1/services/:idUpdate service
DELETE/api/v1/services/:idDelete service
GET/api/v1/services/:id/attendanceService attendance

Attendance

MethodEndpointDescription
POST/api/v1/attendanceCheck in member
POST/api/v1/attendance/bulkBulk check in
DELETE/api/v1/attendance/:idRemove record

Getting Started

Prerequisites

  • Rust 1.83+
  • PostgreSQL 16+ (or Docker)

Local Development

  1. Clone and setup:

    cd cms-api
    cp .env.example .env
    # Edit .env with your database credentials
  2. Create database:

    createdb cms_api
  3. Run the server:

    cargo run

Docker Development

  1. Start everything:

    docker compose up --build
  2. With hot reload:

    docker compose -f docker-compose.dev.yml up --build
  3. Just the database:

    docker compose up db
    cargo run

Running Tests

  1. Create test database:

    createdb cms_api_test
    # Or with Docker:
    docker exec -it <container> psql -U postgres -c "CREATE DATABASE cms_api_test"
  2. Run tests (sequential for DB tests):

    cargo test -- --test-threads=1
  3. With output:

    cargo test -- --test-threads=1 --nocapture

Environment Variables

VariableDescriptionDefault
DATABASE_URLPostgreSQL connection stringRequired
JWT_SECRETSecret key for JWT signingRequired
JWT_EXPIRATION_HOURSAccess token lifetime24
REFRESH_TOKEN_EXPIRATION_DAYSRefresh token lifetime7
SERVER_HOSTServer bind address0.0.0.0
SERVER_PORTServer port3000
RUST_LOGLog levelcms_api=debug

CSV Import Format

For bulk member import, use this CSV format:

first_name,last_name,email,phone,date_of_birth,gender,address,membership_status,membership_dateJohn,Smith,john@example.com,555-0100,1985-03-15,male,"123 Main St",active,2020-01-01

See sample_members.csv for a complete example.

Database Schema

The database includes these tables:

  • users - Admin accounts
  • households - Family groupings
  • members - Church members (with soft delete)
  • groups - Ministries, committees, etc.
  • member_groups - Many-to-many relationship
  • services - Church services/events
  • attendance - Service attendance records
  • refresh_tokens - JWT refresh token storage

Migrations are in the migrations/ directory and run automatically on startup.

License

Private project - All rights reserved.

About

Church management system backend API

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages