- Go API server with PostgreSQL + Redis - AI floor replacement (OpenRouter Gemini) - Product database (10 brands, 3539 products) - Recommendation engine, calculator, articles - Redis async queue + worker pool - Hot product caching, brand view tracking - JWT auth, favorites, projects - Docker deployment ready Co-Authored-By: Claude <noreply@anthropic.com>
80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package repository
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"floorvisualizer/internal/model"
|
|
)
|
|
|
|
func CreateProject(d *sql.DB, userID, name, originalURL, generatedURL, floorStyle, pattern, roomType string) (*model.Project, error) {
|
|
var p model.Project
|
|
err := d.QueryRow(`
|
|
INSERT INTO projects (user_id, name, original_image_url, generated_image_url, floor_style, pattern, room_type)
|
|
VALUES ($1,$2,$3,$4,$5,$6,$7)
|
|
RETURNING id, user_id, name, original_image_url, generated_image_url, floor_style, pattern, room_type, created_at, updated_at
|
|
`, userID, name, originalURL, generatedURL, floorStyle, pattern, roomType).Scan(
|
|
&p.ID, &p.UserID, &p.Name, &p.OriginalImageURL, &p.GeneratedImageURL,
|
|
&p.FloorStyle, &p.Pattern, &p.RoomType, &p.CreatedAt, &p.UpdatedAt)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create project: %w", err)
|
|
}
|
|
return &p, nil
|
|
}
|
|
|
|
func UpdateProject(d *sql.DB, id, userID, name string) (*model.Project, error) {
|
|
var p model.Project
|
|
err := d.QueryRow(`
|
|
UPDATE projects SET name=$1, updated_at=now() WHERE id=$2 AND user_id=$3
|
|
RETURNING id, user_id, name, original_image_url, generated_image_url, floor_style, pattern, room_type, created_at, updated_at
|
|
`, name, id, userID).Scan(
|
|
&p.ID, &p.UserID, &p.Name, &p.OriginalImageURL, &p.GeneratedImageURL,
|
|
&p.FloorStyle, &p.Pattern, &p.RoomType, &p.CreatedAt, &p.UpdatedAt)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("update project: %w", err)
|
|
}
|
|
return &p, nil
|
|
}
|
|
|
|
func DeleteProject(d *sql.DB, id, userID string) error {
|
|
_, err := d.Exec(`DELETE FROM projects WHERE id=$1 AND user_id=$2`, id, userID)
|
|
return err
|
|
}
|
|
|
|
func ListProjects(d *sql.DB, userID string) ([]model.Project, error) {
|
|
rows, err := d.Query(`
|
|
SELECT id, user_id, name, original_image_url, generated_image_url,
|
|
floor_style, pattern, room_type, created_at, updated_at
|
|
FROM projects WHERE user_id=$1 ORDER BY created_at DESC
|
|
`, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var out []model.Project
|
|
for rows.Next() {
|
|
var p model.Project
|
|
if err := rows.Scan(&p.ID, &p.UserID, &p.Name, &p.OriginalImageURL, &p.GeneratedImageURL,
|
|
&p.FloorStyle, &p.Pattern, &p.RoomType, &p.CreatedAt, &p.UpdatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
out = append(out, p)
|
|
}
|
|
return out, rows.Err()
|
|
}
|
|
|
|
func GetProject(d *sql.DB, id, userID string) (*model.Project, error) {
|
|
var p model.Project
|
|
err := d.QueryRow(`
|
|
SELECT id, user_id, name, original_image_url, generated_image_url,
|
|
floor_style, pattern, room_type, created_at, updated_at
|
|
FROM projects WHERE id=$1 AND user_id=$2
|
|
`, id, userID).Scan(
|
|
&p.ID, &p.UserID, &p.Name, &p.OriginalImageURL, &p.GeneratedImageURL,
|
|
&p.FloorStyle, &p.Pattern, &p.RoomType, &p.CreatedAt, &p.UpdatedAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &p, nil
|
|
}
|