floorplan.go (2890B)
1 package backend 2 3 import ( 4 "database/sql" 5 "errors" 6 "time" 7 ) 8 9 type Floorplan struct { 10 ID ObjectID `json:"id"` 11 User string `json:"user"` 12 Name string `json:"name"` 13 Address *string `json:"address"` 14 Synopsis *string `json:"synopsis"` 15 Updated time.Time `json:"updated"` 16 Created time.Time `json:"created"` 17 } 18 19 func (e *Env) CreateFloorplan(tx *sql.Tx, template *Floorplan) (*Floorplan, error) { 20 stmt, err := e.CacheTxStmt(tx, "create_floorplan", `INSERT INTO spaceplanner.floorplans (owner, name, address, synopsis) 21 VALUES ($1, $2, $3, $4) RETURNING id, owner, name, address, synopsis, updated, created`) 22 if err != nil { 23 return nil, err 24 } 25 26 return scanFloorplan(stmt.QueryRow(template.User, template.Name, template.Address, template.Synopsis)) 27 } 28 29 func (e *Env) UpdateFloorplan(tx *sql.Tx, user string, id ObjectID, updated *Floorplan) (*Floorplan, error) { 30 if id.Type != IDTypeFloorplan { 31 return nil, errors.New("Expected floorplan ID") 32 } 33 34 stmt, err := e.CacheTxStmt(tx, "update_floorplan", `UPDATE spaceplanner.floorplans SET (name, address, synopsis) = 35 ($3, $4, $5) WHERE owner = $1 AND id = $2 RETURNING id, owner, name, address, synopsis, updated, created`) 36 if err != nil { 37 return nil, err 38 } 39 40 return scanFloorplan(stmt.QueryRow(user, id.Seq, updated.Name, updated.Address, updated.Synopsis)) 41 } 42 43 func (e *Env) GetFloorplan(tx *sql.Tx, user string, id ObjectID) (*Floorplan, error) { 44 stmt, err := e.CacheTxStmt(tx, "get_floorplan", `SELECT id, owner, name, address, synopsis, updated, created 45 FROM spaceplanner.floorplans 46 WHERE owner = $1 AND id = $2`) 47 if err != nil { 48 return nil, err 49 } 50 51 if id.Type != IDTypeFloorplan { 52 return nil, errors.New("Expected floorplan ID") 53 } 54 return scanFloorplan(stmt.QueryRow(user, id.Seq)) 55 } 56 57 func (e *Env) GetFloorplans(tx *sql.Tx, user string) ([]*Floorplan, error) { 58 stmt, err := e.CacheTxStmt(tx, "get_floorplans", `SELECT id, owner, name, address, synopsis, updated, created 59 FROM spaceplanner.floorplans WHERE owner = $1 60 ORDER BY updated DESC, created DESC`) 61 if err != nil { 62 return nil, err 63 } 64 65 rows, err := stmt.Query(user) 66 if err != nil { 67 return nil, err 68 } 69 defer rows.Close() 70 71 return collectRows(rows, scanFloorplan) 72 } 73 74 func (e *Env) DeleteFloorplan(tx *sql.Tx, user string, id ObjectID) (*Floorplan, error) { 75 if id.Type != IDTypeFloorplan { 76 return nil, errors.New("Expected floorplan ID") 77 } 78 79 stmt, err := e.CacheTxStmt(tx, "del_floorplan", `DELETE FROM spaceplanner.floorplans 80 WHERE owner = $1 AND id = $2 81 RETURNING id, owner, name, address, synopsis, updated, created`) 82 if err != nil { 83 return nil, err 84 } 85 86 return scanFloorplan(stmt.QueryRow(user, id.Seq)) 87 } 88 89 func scanFloorplan(row Scanner) (*Floorplan, error) { 90 var f Floorplan 91 var id int64 92 err := row.Scan(&id, &f.User, &f.Name, &f.Address, &f.Synopsis, &f.Updated, &f.Created) 93 f.ID = makeID(IDTypeFloorplan, id) 94 return &f, err 95 }