golang-template/README.md
Leo 43219268e9 feat: Add Sliding expiration for user_sessions
The user_session is valid for 24 hours, but the session will be bumped if it has been over an hour since the last update. An hour was set as a deadline, so that we would not update the user_session rows too often.
2026-08-17 23:47:11 +03:00

77 lines
1.7 KiB
Markdown

# Go Backend Template
A simple Go backend with authentication using native `net/http` and PostgreSQL.
## Features
- Session-based authentication
- Argon2 password hashing
- PostgreSQL database
- CORS support
- Request logging middleware
- Native Go HTTP server (no external frameworks)
## Requirements
- Go 1.24+
- PostgreSQL
- [goose](https://github.com/pressly/goose) for migrationns
- [sqlc](https://github.com/sqlc-dev/sqlc) for generating typed SQL queries
- [air](https://github.com/air-verse/air) for live reload (optional)
```bash
go install github.com/pressly/goose/v3/cmd/goose@latest
go install github.com/air-verse/air@latest
```
## Setup
1. Copy environment variables:
```bash
cp .env.example .env
```
2. Update `.env` with your database credentials (both the `DB_*` and `GOOSE_*` values).
3. Install dependencies:
```bash
go mod tidy
```
4. Run database migrations:
```bash
./scripts/goose.sh up
```
5. Run the server:
```bash
air # live reload, or:
go run ./cmd
```
## Migrations
`goose.sh` loads `.env` and passes through to goose (`up`, `down`, `status`, ...).
Create a new migration with:
```bash
./scripts/goose-create.sh add_widgets
```
## SQLC (optional)
Query codegen is configured in `sqlc.yaml` (engine `postgresql`, schema read from
`migrations/`). Add `.sql` files under `internal/database/queries/` and run
`sqlc generate` to emit typed accessors into `internal/database/sqlc/`.
## API Endpoints
- `POST /login` - User login
- `GET /user` - Get user info (requires session cookie)
## Database Schema
- `user_auth` - User accounts with Argon2 password hashes
- `user_session` - User sessions with SHA-256 hashed token secrets