feat(db): схема Фазы 2 — сообщения, реакции, read states, файлы, инвайты, FTS5

Миграция 00004: таблицы `messages`, `message_reactions`,
`channel_read_states`, `files`, `invites` и виртуальная таблица `messages_fts`
с триггерами синхронизации (AGENT.md 6.1, 7.6, 7.7, 7.9, 7.15, 7.16).

Полнотекстовый поиск требует сборки с тегом `sqlite_fts5`:
- `GO_TAGS ?= sqlite_fts5` в Makefile (build/test/cover) и в Dockerfile;
- build-tags в golangci-lint;
- страж `internal/database/fts5_guard.go`: сборка без тега падает с понятным
  текстом, а не ломается на миграции в рантайме.
This commit is contained in:
2026-09-19 23:29:39 +03:00
parent 0a82dd3a02
commit 4550bea6cc
5 changed files with 132 additions and 5 deletions
+6 -3
View File
@@ -22,7 +22,10 @@ export GOPROXY ?= https://proxy.golang.org,direct
export GOSUMDB ?= sum.golang.org
export CGO_ENABLED ?= 1
GOFLAGS_LOCAL := -trimpath
# sqlite_fts5 включает полнотекстовый поиск в mattn/go-sqlite3 (AGENT.md 7.15):
# без тега поиск по сообщениям не работает, поэтому он обязателен для всех сборок.
GO_TAGS ?= sqlite_fts5
GOFLAGS_LOCAL := -trimpath -tags $(GO_TAGS)
GO_LDFLAGS := -s -w \
-X main.version=$(VERSION) \
-X main.commit=$(COMMIT) \
@@ -102,12 +105,12 @@ build: ## Собрать бинарник сервера в ./build/glchat
.PHONY: test
test: ## Тесты Go с race-детектором
go test -race -count=1 $(GO_PACKAGES)
go test -tags $(GO_TAGS) -race -count=1 $(GO_PACKAGES)
.PHONY: test-cover
test-cover: ## Тесты с отчётом покрытия (./build/coverage.out)
@mkdir -p $(BUILD_DIR)
go test -race -count=1 -coverprofile=$(BUILD_DIR)/coverage.out $(GO_PACKAGES)
go test -tags $(GO_TAGS) -race -count=1 -coverprofile=$(BUILD_DIR)/coverage.out $(GO_PACKAGES)
go tool cover -func=$(BUILD_DIR)/coverage.out | tail -1
.PHONY: lint