api.spaceplanner.app

Spaceplanner API
git clone git://jacobedwards.org/api.spaceplanner.app
Log | Files | Refs

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 }