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  }