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 }