github.com/jancarloviray/community@v0.41.1-0.20170124221257-33a66c87cf2f/core/api/endpoint/pin_endpoint.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 endpoint
    13  
    14  import (
    15  	"database/sql"
    16  	"encoding/json"
    17  	"io/ioutil"
    18  	"net/http"
    19  	"strings"
    20  
    21  	"github.com/documize/community/core/api/entity"
    22  	"github.com/documize/community/core/api/request"
    23  	"github.com/documize/community/core/api/util"
    24  	"github.com/documize/community/core/log"
    25  
    26  	"github.com/gorilla/mux"
    27  )
    28  
    29  // AddPin saves pinned item.
    30  func AddPin(w http.ResponseWriter, r *http.Request) {
    31  	method := "AddPin"
    32  	p := request.GetPersister(r)
    33  	params := mux.Vars(r)
    34  	userID := params["userID"]
    35  
    36  	if !p.Context.Authenticated {
    37  		writeForbiddenError(w)
    38  		return
    39  	}
    40  
    41  	if len(userID) == 0 {
    42  		writeMissingDataError(w, method, "userID")
    43  		return
    44  	}
    45  
    46  	defer r.Body.Close()
    47  	body, err := ioutil.ReadAll(r.Body)
    48  	if err != nil {
    49  		writePayloadError(w, method, err)
    50  		return
    51  	}
    52  
    53  	var pin entity.Pin
    54  	err = json.Unmarshal(body, &pin)
    55  	if err != nil {
    56  		writePayloadError(w, method, err)
    57  		return
    58  	}
    59  
    60  	pin.RefID = util.UniqueID()
    61  	pin.OrgID = p.Context.OrgID
    62  	pin.UserID = p.Context.UserID
    63  	pin.Pin = strings.TrimSpace(pin.Pin)
    64  	if len(pin.Pin) > 20 {
    65  		pin.Pin = pin.Pin[0:20]
    66  	}
    67  
    68  	tx, err := request.Db.Beginx()
    69  	if err != nil {
    70  		writeTransactionError(w, method, err)
    71  		return
    72  	}
    73  
    74  	p.Context.Transaction = tx
    75  
    76  	err = p.AddPin(pin)
    77  	if err != nil {
    78  		log.IfErr(tx.Rollback())
    79  		writeGeneralSQLError(w, method, err)
    80  		return
    81  	}
    82  
    83  	log.IfErr(tx.Commit())
    84  
    85  	newPin, err := p.GetPin(pin.RefID)
    86  	if err != nil {
    87  		writeGeneralSQLError(w, method, err)
    88  		return
    89  	}
    90  
    91  	util.WriteJSON(w, newPin)
    92  }
    93  
    94  // GetUserPins returns users' pins.
    95  func GetUserPins(w http.ResponseWriter, r *http.Request) {
    96  	method := "GetUserPins"
    97  	p := request.GetPersister(r)
    98  	params := mux.Vars(r)
    99  	userID := params["userID"]
   100  
   101  	if len(userID) == 0 {
   102  		writeMissingDataError(w, method, "userID")
   103  		return
   104  	}
   105  
   106  	if p.Context.UserID != userID {
   107  		writeForbiddenError(w)
   108  		return
   109  	}
   110  
   111  	pins, err := p.GetUserPins(userID)
   112  
   113  	if err != nil && err != sql.ErrNoRows {
   114  		writeGeneralSQLError(w, method, err)
   115  		return
   116  	}
   117  
   118  	if err == sql.ErrNoRows {
   119  		pins = []entity.Pin{}
   120  	}
   121  
   122  	json, err := json.Marshal(pins)
   123  
   124  	if err != nil {
   125  		writeJSONMarshalError(w, method, "pin", err)
   126  		return
   127  	}
   128  
   129  	writeSuccessBytes(w, json)
   130  }
   131  
   132  // DeleteUserPin removes saved user pin.
   133  func DeleteUserPin(w http.ResponseWriter, r *http.Request) {
   134  	method := "DeleteUserPin"
   135  	p := request.GetPersister(r)
   136  	params := mux.Vars(r)
   137  	userID := params["userID"]
   138  	pinID := params["pinID"]
   139  
   140  	if len(userID) == 0 {
   141  		writeMissingDataError(w, method, "userID")
   142  		return
   143  	}
   144  
   145  	if len(pinID) == 0 {
   146  		writeMissingDataError(w, method, "pinID")
   147  		return
   148  	}
   149  
   150  	if p.Context.UserID != userID {
   151  		writeForbiddenError(w)
   152  		return
   153  	}
   154  
   155  	tx, err := request.Db.Beginx()
   156  	if err != nil {
   157  		writeTransactionError(w, method, err)
   158  		return
   159  	}
   160  
   161  	p.Context.Transaction = tx
   162  
   163  	_, err = p.DeletePin(pinID)
   164  
   165  	if err != nil && err != sql.ErrNoRows {
   166  		log.IfErr(tx.Rollback())
   167  		writeGeneralSQLError(w, method, err)
   168  		return
   169  	}
   170  
   171  	log.IfErr(tx.Commit())
   172  
   173  	util.WriteSuccessEmptyJSON(w)
   174  }
   175  
   176  // UpdatePinSequence records order of pinned items.
   177  func UpdatePinSequence(w http.ResponseWriter, r *http.Request) {
   178  	method := "UpdatePinSequence"
   179  	p := request.GetPersister(r)
   180  	params := mux.Vars(r)
   181  	userID := params["userID"]
   182  
   183  	if !p.Context.Authenticated {
   184  		writeForbiddenError(w)
   185  		return
   186  	}
   187  
   188  	if len(userID) == 0 {
   189  		writeMissingDataError(w, method, "userID")
   190  		return
   191  	}
   192  
   193  	defer r.Body.Close()
   194  	body, err := ioutil.ReadAll(r.Body)
   195  	if err != nil {
   196  		writePayloadError(w, method, err)
   197  		return
   198  	}
   199  
   200  	var pins []string
   201  
   202  	err = json.Unmarshal(body, &pins)
   203  	if err != nil {
   204  		writePayloadError(w, method, err)
   205  		return
   206  	}
   207  
   208  	tx, err := request.Db.Beginx()
   209  	if err != nil {
   210  		writeTransactionError(w, method, err)
   211  		return
   212  	}
   213  
   214  	p.Context.Transaction = tx
   215  
   216  	for k, v := range pins {
   217  		err = p.UpdatePinSequence(v, k+1)
   218  
   219  		if err != nil {
   220  			log.IfErr(tx.Rollback())
   221  			writeGeneralSQLError(w, method, err)
   222  			return
   223  		}
   224  	}
   225  
   226  	log.IfErr(tx.Commit())
   227  
   228  	newPins, err := p.GetUserPins(userID)
   229  	if err != nil {
   230  		writeGeneralSQLError(w, method, err)
   231  		return
   232  	}
   233  
   234  	util.WriteJSON(w, newPins)
   235  }