chore(服务端): 初始化工程仓库

This commit is contained in:
leon_mac
2026-10-18 15:11:44 +08:00
commit 13c8bcbf3c
23 changed files with 2543 additions and 0 deletions
+88
View File
@@ -0,0 +1,88 @@
package server
import (
"context"
_ "embed"
"encoding/json"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"perler-beads-server/internal/domain"
"time"
)
//go:embed migrations/001_initial.sql
var migration string
func (s *Server) put(ctx context.Context, kind, id, store, owner string, v any) error {
b, e := json.Marshal(v)
if e != nil {
return e
}
_, e = s.DB.Exec(ctx, `INSERT INTO documents(kind,id,store_id,owner_id,body) VALUES($1,$2,$3,$4,$5) ON CONFLICT(kind,id) DO UPDATE SET body=EXCLUDED.body,store_id=EXCLUDED.store_id,owner_id=EXCLUDED.owner_id`, kind, id, store, owner, b)
return e
}
func (s *Server) get(ctx context.Context, kind, id string, v any) error {
var b []byte
e := s.DB.QueryRow(ctx, `SELECT body FROM documents WHERE kind=$1 AND id=$2`, kind, id).Scan(&b)
if e != nil {
return e
}
return json.Unmarshal(b, v)
}
func getTx(ctx context.Context, tx pgx.Tx, kind, id string, v any) error {
var b []byte
if err := tx.QueryRow(ctx, `SELECT body FROM documents WHERE kind=$1 AND id=$2`, kind, id).Scan(&b); err != nil {
return err
}
return json.Unmarshal(b, v)
}
func rollback(tx pgx.Tx) {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
_ = tx.Rollback(ctx)
}
func (s *Server) list(ctx context.Context, kind string) ([]json.RawMessage, error) {
rows, e := s.DB.Query(ctx, `SELECT body FROM documents WHERE kind=$1 ORDER BY id`, kind)
if e != nil {
return nil, e
}
defer rows.Close()
out := []json.RawMessage{}
for rows.Next() {
var b []byte
if e = rows.Scan(&b); e != nil {
return nil, e
}
out = append(out, b)
}
return out, rows.Err()
}
func Migrate(ctx context.Context, db *pgxpool.Pool) error { _, e := db.Exec(ctx, migration); return e }
func (s *Server) Seed(ctx context.Context) error {
var n int
if e := s.DB.QueryRow(ctx, `SELECT count(*) FROM documents WHERE kind='store'`).Scan(&n); e != nil {
return e
}
if n > 0 {
return nil
}
store := domain.Store{ID: "store-001", Name: "拼豆体验店(演示)", Address: "请在后台配置真实地址", Hours: "10:00–20:00(演示)", Notice: "演示色板非品牌真实色号"}
cs := demoColors()
if e := s.put(ctx, "store", store.ID, store.ID, "", store); e != nil {
return e
}
if e := s.put(ctx, "palette", store.ID, store.ID, "", cs); e != nil {
return e
}
if e := s.put(ctx, "tables", store.ID, store.ID, "", []domain.Table{{Code: "T01", Label: "1 号桌(演示)", Enabled: true}, {Code: "T02", Label: "2 号桌(演示)", Enabled: true}}); e != nil {
return e
}
for _, p := range demoPatterns(store.ID, cs) {
if e := s.put(ctx, "pattern", p.ID, p.StoreID, "", p); e != nil {
return e
}
}
return nil
}