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  }