github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/sdk/document.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 documize 13 14 import ( 15 "bytes" 16 "encoding/json" 17 "errors" 18 "io/ioutil" 19 "net/http" 20 "net/url" 21 "strings" 22 23 "github.com/documize/community/documize/api/entity" 24 ) 25 26 // DeleteDocument removes the given document from the Documize database. 27 func (c *Client) DeleteDocument(documentID string) error { 28 req, err := http.NewRequest("DELETE", 29 c.BaseURL+"/api/documents/"+documentID, 30 nil) 31 if err != nil { 32 return err 33 } 34 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 35 resp, err := c.Client.Do(req) 36 if err != nil { 37 return err 38 } 39 defer resp.Body.Close() // ignore error 40 b, err := ioutil.ReadAll(resp.Body) 41 if err != nil { 42 return err 43 } 44 if string(b) == emptyBraces { 45 return nil 46 } 47 48 return errors.New(string(b)) 49 } 50 51 // GetDocument gets the document information. 52 func (c *Client) GetDocument(documentID string) (*entity.Document, error) { 53 req, err := http.NewRequest("GET", 54 c.BaseURL+"/api/documents/"+documentID, 55 nil) 56 if err != nil { 57 return nil, err 58 } 59 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 60 resp, err := c.Client.Do(req) 61 if err != nil { 62 return nil, err 63 } 64 defer resp.Body.Close() // ignore error 65 b, err := ioutil.ReadAll(resp.Body) 66 if err != nil { 67 return nil, err 68 } 69 var dm entity.Document 70 err = json.Unmarshal(b, &dm) 71 if err != nil { 72 return nil, errors.New(trimErrors(string(b))) 73 } 74 return &dm, nil 75 } 76 77 // UpdateDocument updates document information obtained from GetDocument. 78 func (c *Client) UpdateDocument(document *entity.Document) error { 79 if document == nil { 80 return errors.New("nil document passed to UpdateDocument") 81 } 82 req, err := http.NewRequest("PUT", 83 c.BaseURL+"/api/documents/"+document.RefID, 84 nil) 85 if err != nil { 86 return err 87 } 88 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 89 buf, err := json.Marshal(document) 90 if err != nil { 91 return err 92 } 93 req.Body = ioutil.NopCloser(bytes.NewReader(buf)) 94 resp, err := c.Client.Do(req) 95 if err != nil { 96 return err 97 } 98 defer resp.Body.Close() // ignore error 99 _, err = ioutil.ReadAll(resp.Body) 100 return err 101 } 102 103 // GetDocumentMeta gets the metadata for a document. 104 func (c *Client) GetDocumentMeta(documentID string) (*entity.DocumentMeta, error) { 105 req, err := http.NewRequest("GET", 106 c.BaseURL+"/api/documents/"+documentID+"/meta", 107 nil) 108 if err != nil { 109 return nil, err 110 } 111 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 112 resp, err := c.Client.Do(req) 113 if err != nil { 114 return nil, err 115 } 116 defer resp.Body.Close() // ignore error 117 b, err := ioutil.ReadAll(resp.Body) 118 if err != nil { 119 return nil, err 120 } 121 var dm entity.DocumentMeta 122 err = json.Unmarshal(b, &dm) 123 if err != nil { 124 return nil, errors.New(trimErrors(string(b))) 125 } 126 return &dm, nil 127 } 128 129 // GetDocumentsByFolder returns a slice of document information for a given folder. 130 func (c *Client) GetDocumentsByFolder(folderID string) ([]entity.Document, error) { 131 req, err := http.NewRequest("GET", 132 c.BaseURL+"/api/documents?folder="+folderID, 133 nil) 134 if err != nil { 135 return nil, err 136 } 137 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 138 resp, err := c.Client.Do(req) 139 if err != nil { 140 return nil, err 141 } 142 defer resp.Body.Close() // ignore error 143 b, err := ioutil.ReadAll(resp.Body) 144 if err != nil { 145 return nil, err 146 } 147 var dm []entity.Document 148 err = json.Unmarshal(b, &dm) 149 if err != nil { 150 return nil, errors.New(trimErrors(string(b))) 151 } 152 return dm, nil 153 } 154 155 // SearchDocuments returns a list of documements which contain the supplied keywords. 156 // TODO explain the format of the keywords string (when not just the single word sought). 157 func (c *Client) SearchDocuments(keywords string) ([]entity.DocumentSearch, error) { 158 req, err := http.NewRequest("GET", 159 c.BaseURL+"/api/search?keywords="+url.QueryEscape(keywords), 160 nil) 161 if err != nil { 162 return nil, err 163 } 164 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 165 resp, err := c.Client.Do(req) 166 if err != nil { 167 return nil, err 168 } 169 defer resp.Body.Close() // ignore error 170 b, err := ioutil.ReadAll(resp.Body) 171 if err != nil { 172 return nil, err 173 } 174 var ds []entity.DocumentSearch 175 err = json.Unmarshal(b, &ds) 176 if err != nil { 177 return nil, errors.New(trimErrors(string(b))) 178 } 179 return ds, nil 180 } 181 182 // GetDocumentAsDocx returns a file-name and content for the given documentID. 183 // TODO allow the selection of either HTML or DOCX format. 184 func (c *Client) GetDocumentAsDocx(documentID string) (string, []byte, error) { 185 req, err := http.NewRequest("GET", 186 c.BaseURL+"/api/documents/"+documentID+"/export", 187 nil) 188 if err != nil { 189 return "", nil, err 190 } 191 req.Header.Add(HeaderAuthTokenName, c.Auth.Token) 192 resp, err := c.Client.Do(req) 193 if err != nil { 194 return "", nil, err 195 } 196 defer resp.Body.Close() // ignore error 197 b, err := ioutil.ReadAll(resp.Body) 198 if err != nil { 199 return "", nil, err 200 } 201 202 filename := resp.Header.Get("Content-Disposition") 203 filename = strings.TrimSpace(strings.TrimPrefix(filename, "attachment; filename=")) 204 if len(filename) == 0 { 205 return "", nil, errors.New("Unknown document to download") 206 } 207 208 return filename, b, nil 209 }