Files
mygo/docs/server/development.md
T
ld a18f96912d feat(repository): refactor query/mutation ports with capability-safe
interfaces

- refactor: split UserRepository into AuthUserRepository and
  AdminUserRepository capabilities
- refactor: split SessionRepository into AuthSessionRepository and
  repository-owned CLI/admin methods
- refactor: replace generic Repository Update/Delete with
  operation-specific params and ownership predicates
- refactor: replace CredentialRepository generic CRUD with
  passkey-specific methods
- refactor: replace FileRepository generic Create/Update/Delete with
  UploadedFileParams, DirectoryParams, and owned soft-delete
- refactor: remove repository fields from WebApp struct; repositories
  are now composition-time wiring only
- feat: add domain error kinds ErrParentNotFound, ErrParentNotDir,
  ErrDirectoryNotEmpty, ErrInvalidMove
- feat: add CredentialTypeAppPasskey constant
- feat: add testutil.SetUserAdmin for test fixture setup that bypasses
  production service ports
- test: add architecture test banning GORM Save in repository package
- test: add capability interface contract tests ensuring each service
  receives the minimal interface
- test: add blockingStorage helper for concurrent promotion tests
- test: add preserved DSN parameter test for sqliteImmediateDSN
- docs: update architecture decisions with repository write rules and
  capability separation
- docs: update roadmap to clarify atomic single-use refresh sessions
- docs: add -race test target to development docs
2026-07-16 12:24:36 +08:00

2.3 KiB

Development

Prerequisites

  • Go 1.26.2 (pinned in mise.toml)
  • mise (https://mise.jdx.dev) — run mise install to install toolchain

Build

go build ./...
go build -o mygo .

Test

go test ./...
go test -v -run TestName ./internal/...
go test -race ./internal/repository ./internal/service ./internal/server

Lint & Format

go vet ./...
go fmt ./...

Repository Review

Use the repository-scoped $mygo-api-repo-review skill for evidence-based architecture, design, security, resilience, data-consistency, performance, and implementation audits. Reviews are read-only unless fixes are requested separately.

Select one review mode:

  • diff compares the current workspace, including relevant untracked files, with HEAD.
  • main compares the current workspace with the merge base of HEAD and the local main branch without fetching remote refs.
  • full reviews the current repository as a whole.

Optionally limit any mode to a target path, Go package, or logical component. For example:

Use $mygo-api-repo-review in main mode with target internal/storage.

Dependencies

go mod tidy     # after adding/removing imports

Config

Server config is loaded via viper from config.yaml (defaults in internal/config/load.go).

For SQLite, the repository preserves configured DSN parameters and adds _txlock=immediate. Write transactions therefore reserve the database before performing hierarchy or refresh-session reads, matching the locking assumptions used by the repository commands. Keep this behavior when supplying a SQLite URI such as file:mygo.db?cache=shared.

server:
    host: 0.0.0.0
    port: 10086

database:
    driver: sqlite3
    sqlite:
        path: data/mygo.db

storage:
    driver: local
    local:
        path: data/files

jwt:
    secret: dev-secret-do-not-use-in-production
    access_ttl: 15m
    refresh_ttl: 168h

Environment variables use MYGO_ prefix with underscore separators: MYGO_SERVER_PORT=8080, MYGO_JWT_SECRET=...

The default JWT secret is a development placeholder. At startup, MyGO replaces it with an ephemeral runtime secret; set a stable jwt.secret or MYGO_JWT_SECRET when tokens must survive restarts or when running multiple instances.