github.com/jancarloviray/community@v0.41.1-0.20170124221257-33a66c87cf2f/core/api/request/block.go (about) 1 // Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved. 2 // 3 // This software (Documize Community Edition) is licensed under 4 // GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html 5 // 6 // You can operate outside the AGPL restrictions by purchasing 7 // Documize Enterprise Edition and obtaining a commercial license 8 // by contacting <sales@documize.com>. 9 // 10 // https://documize.com 11 12 package request 13 14 import ( 15 "database/sql" 16 "fmt" 17 "time" 18 19 "github.com/documize/community/core/api/entity" 20 "github.com/documize/community/core/log" 21 "github.com/documize/community/core/utility" 22 "github.com/jmoiron/sqlx" 23 ) 24 25 // AddBlock saves reusable content block. 26 func (p *Persister) AddBlock(b entity.Block) (err error) { 27 b.OrgID = p.Context.OrgID 28 b.UserID = p.Context.UserID 29 b.Created = time.Now().UTC() 30 b.Revised = time.Now().UTC() 31 32 stmt, err := p.Context.Transaction.Preparex("INSERT INTO block (refid, orgid, labelid, userid, contenttype, pagetype, title, body, excerpt, rawbody, config, externalsource, used, created, revised) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") 33 defer utility.Close(stmt) 34 35 if err != nil { 36 log.Error("Unable to prepare insert AddBlock", err) 37 return 38 } 39 40 _, err = stmt.Exec(b.RefID, b.OrgID, b.LabelID, b.UserID, b.ContentType, b.PageType, b.Title, b.Body, b.Excerpt, b.RawBody, b.Config, b.ExternalSource, b.Used, b.Created, b.Revised) 41 42 if err != nil { 43 log.Error("Unable to execute insert AddBlock", err) 44 return 45 } 46 47 return 48 } 49 50 // GetBlock returns requested reusable content block. 51 func (p *Persister) GetBlock(id string) (b entity.Block, err error) { 52 stmt, err := Db.Preparex("SELECT a.id, a.refid, a.orgid, a.labelid, a.userid, a.contenttype, a.pagetype, a.title, a.body, a.excerpt, a.rawbody, a.config, a.externalsource, a.used, a.created, a.revised, b.firstname, b.lastname FROM block a LEFT JOIN user b ON a.userid = b.refid WHERE a.orgid=? AND a.refid=?") 53 defer utility.Close(stmt) 54 55 if err != nil { 56 log.Error(fmt.Sprintf("Unable to prepare select GetBlock %s", id), err) 57 return 58 } 59 60 err = stmt.Get(&b, p.Context.OrgID, id) 61 if err != nil { 62 log.Error(fmt.Sprintf("Unable to execute select GetBlock %s", id), err) 63 return 64 } 65 66 return 67 } 68 69 // GetBlocksForSpace returns all reusable content scoped to given space. 70 func (p *Persister) GetBlocksForSpace(labelID string) (b []entity.Block, err error) { 71 err = Db.Select(&b, "SELECT a.id, a.refid, a.orgid, a.labelid, a.userid, a.contenttype, a.pagetype, a.title, a.body, a.excerpt, a.rawbody, a.config, a.externalsource, a.used, a.created, a.revised, b.firstname, b.lastname FROM block a LEFT JOIN user b ON a.userid = b.refid WHERE a.orgid=? AND a.labelid=? ORDER BY a.title", p.Context.OrgID, labelID) 72 73 if err != nil { 74 log.Error(fmt.Sprintf("Unable to execute select GetBlocksForSpace org %s and label %s", p.Context.OrgID, labelID), err) 75 return 76 } 77 78 return 79 } 80 81 // IncrementBlockUsage increments usage counter for content block. 82 func (p *Persister) IncrementBlockUsage(id string) (err error) { 83 stmt, err := p.Context.Transaction.Preparex("UPDATE block SET used=used+1, revised=? WHERE orgid=? AND refid=?") 84 defer utility.Close(stmt) 85 if err != nil { 86 log.Error(fmt.Sprintf("Unable to prepare update IncrementBlockUsage id %s", id), err) 87 return 88 } 89 90 _, err = stmt.Exec(time.Now().UTC(), p.Context.OrgID, id) 91 if err != nil { 92 log.Error(fmt.Sprintf("Unable to execute IncrementBlockUsage id %s", id), err) 93 return 94 } 95 96 return 97 } 98 99 // DecrementBlockUsage decrements usage counter for content block. 100 func (p *Persister) DecrementBlockUsage(id string) (err error) { 101 stmt, err := p.Context.Transaction.Preparex("UPDATE block SET used=used-1, revised=? WHERE orgid=? AND refid=?") 102 defer utility.Close(stmt) 103 if err != nil { 104 log.Error(fmt.Sprintf("Unable to prepare update DecrementBlockUsage id %s", id), err) 105 return 106 } 107 108 _, err = stmt.Exec(time.Now().UTC(), p.Context.OrgID, id) 109 if err != nil { 110 log.Error(fmt.Sprintf("Unable to execute DecrementBlockUsage id %s", id), err) 111 return 112 } 113 114 return 115 } 116 117 // RemoveBlockReference clears page.blockid for given blockID. 118 func (p *Persister) RemoveBlockReference(id string) (err error) { 119 stmt, err := p.Context.Transaction.Preparex("UPDATE page SET blockid='', revised=? WHERE orgid=? AND blockid=?") 120 defer utility.Close(stmt) 121 if err != nil { 122 log.Error(fmt.Sprintf("Unable to prepare update RemoveBlockReference id %s", id), err) 123 return 124 } 125 126 _, err = stmt.Exec(time.Now().UTC(), p.Context.OrgID, id) 127 128 // skip no rows affected 129 if err == sql.ErrNoRows { 130 return 131 } 132 133 if err != nil { 134 log.Error(fmt.Sprintf("Unable to execute RemoveBlockReference id %s", id), err) 135 return 136 } 137 138 return 139 } 140 141 // UpdateBlock updates existing reusable content block item. 142 func (p *Persister) UpdateBlock(b entity.Block) (err error) { 143 b.Revised = time.Now().UTC() 144 145 var stmt *sqlx.NamedStmt 146 stmt, err = p.Context.Transaction.PrepareNamed("UPDATE block SET title=:title, body=:body, excerpt=:excerpt, rawbody=:rawbody, config=:config, revised=:revised WHERE orgid=:orgid AND refid=:refid") 147 defer utility.Close(stmt) 148 149 if err != nil { 150 log.Error(fmt.Sprintf("Unable to prepare update UpdateBlock %s", b.RefID), err) 151 return 152 } 153 154 _, err = stmt.Exec(&b) 155 if err != nil { 156 log.Error(fmt.Sprintf("Unable to execute update UpdateBlock %s", b.RefID), err) 157 return 158 } 159 160 return 161 } 162 163 // DeleteBlock removes reusable content block from database. 164 func (p *Persister) DeleteBlock(id string) (rows int64, err error) { 165 return p.Base.DeleteConstrained(p.Context.Transaction, "block", p.Context.OrgID, id) 166 }