Implement motion editing
[cacert-boardvoting.git] / models.go
index a8d24ad..8194dc9 100644 (file)
--- a/models.go
+++ b/models.go
@@ -19,6 +19,7 @@ const (
        sqlCountOlderThanDecision
        sqlCountOlderThanUnvotedDecision
        sqlCreateDecision
+       sqlUpdateDecision
 )
 
 var sqlStatements = map[sqlKey]string{
@@ -92,6 +93,11 @@ INSERT INTO decisions (
                        BETWEEN date(:proposed) AND date(:proposed, '1 day')
     )
 )`,
+       sqlUpdateDecision: `
+UPDATE decisions
+SET proponent=:proponent, title=:title, content=:content,
+    votetype=:votetype, due=:due, modified=:modified
+WHERE id=:id`,
 }
 
 var db *sqlx.DB
@@ -376,7 +382,7 @@ func (d *Decision) OlderExists(unvoted bool, voter *Voter) (result bool, err err
        return
 }
 
-func (d *Decision) Save() (err error) {
+func (d *Decision) Create() (err error) {
        insertDecisionStmt, err := db.PrepareNamed(sqlStatements[sqlCreateDecision])
        if err != nil {
                logger.Println("Error preparing statement:", err)
@@ -393,8 +399,8 @@ func (d *Decision) Save() (err error) {
        lastInsertId, err := result.LastInsertId()
        if err != nil {
                logger.Println("Error getting id of inserted motion:", err)
+               return
        }
-       logger.Println("DEBUG new motion has id", lastInsertId)
 
        getDecisionStmt, err := db.Preparex(sqlStatements[sqlLoadDecisionById])
        if err != nil {
@@ -411,6 +417,42 @@ func (d *Decision) Save() (err error) {
        return
 }
 
+func (d *Decision) Update() (err error) {
+       updateDecisionStmt, err := db.PrepareNamed(sqlStatements[sqlUpdateDecision])
+       if err != nil {
+               logger.Println("Error preparing statement:", err)
+               return
+       }
+       defer updateDecisionStmt.Close()
+
+       result, err := updateDecisionStmt.Exec(d)
+       if err != nil {
+               logger.Println("Error updating motion:", err)
+               return
+       }
+       affectedRows, err := result.RowsAffected()
+       if err != nil {
+               logger.Print("Problem determining the affected rows")
+               return
+       } else if affectedRows != 1 {
+               logger.Printf("WARNING wrong number of affected rows: %d (1 expected)\n", affectedRows)
+       }
+
+       getDecisionStmt, err := db.Preparex(sqlStatements[sqlLoadDecisionById])
+       if err != nil {
+               logger.Println("Error preparing statement:", err)
+               return
+       }
+       defer getDecisionStmt.Close()
+
+       err = getDecisionStmt.Get(d, d.Id)
+       if err != nil {
+               logger.Println("Error loading updated motion:", err)
+       }
+
+       return
+}
+
 func FindVoterByAddress(emailAddress string) (voter *Voter, err error) {
        findVoterStmt, err := db.Preparex(sqlStatements[sqlLoadEnabledVoterByEmail])
        if err != nil {