284 lines
8.4 KiB
Go
284 lines
8.4 KiB
Go
// Package api has type definitions for box
|
|
//
|
|
// Converted from the API docs with help from https://mholt.github.io/json-to-go/
|
|
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// 2017-05-03T07:26:10-07:00
|
|
timeFormat = `"` + time.RFC3339 + `"`
|
|
)
|
|
|
|
// Time represents date and time information for the
|
|
// box API, by using RFC3339
|
|
type Time time.Time
|
|
|
|
// MarshalJSON turns a Time into JSON (in UTC)
|
|
func (t *Time) MarshalJSON() (out []byte, err error) {
|
|
timeString := (*time.Time)(t).Format(timeFormat)
|
|
return []byte(timeString), nil
|
|
}
|
|
|
|
// UnmarshalJSON turns JSON into a Time
|
|
func (t *Time) UnmarshalJSON(data []byte) error {
|
|
newT, err := time.Parse(timeFormat, string(data))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*t = Time(newT)
|
|
return nil
|
|
}
|
|
|
|
// Error is returned from box when things go wrong
|
|
type Error struct {
|
|
Type string `json:"type"`
|
|
Status int `json:"status"`
|
|
Code string `json:"code"`
|
|
ContextInfo json.RawMessage `json:"context_info"`
|
|
HelpURL string `json:"help_url"`
|
|
Message string `json:"message"`
|
|
RequestID string `json:"request_id"`
|
|
}
|
|
|
|
// Error returns a string for the error and satisfies the error interface
|
|
func (e *Error) Error() string {
|
|
out := fmt.Sprintf("Error %q (%d)", e.Code, e.Status)
|
|
if e.Message != "" {
|
|
out += ": " + e.Message
|
|
}
|
|
if e.ContextInfo != nil {
|
|
out += fmt.Sprintf(" (%+v)", e.ContextInfo)
|
|
}
|
|
return out
|
|
}
|
|
|
|
// Check Error satisfies the error interface
|
|
var _ error = (*Error)(nil)
|
|
|
|
// ItemFields are the fields needed for FileInfo
|
|
var ItemFields = "type,id,sequence_id,etag,sha1,name,size,created_at,modified_at,content_created_at,content_modified_at,item_status,shared_link,owned_by"
|
|
|
|
// Types of things in Item
|
|
const (
|
|
ItemTypeFolder = "folder"
|
|
ItemTypeFile = "file"
|
|
ItemStatusActive = "active"
|
|
ItemStatusTrashed = "trashed"
|
|
ItemStatusDeleted = "deleted"
|
|
)
|
|
|
|
// Item describes a folder or a file as returned by Get Folder Items and others
|
|
type Item struct {
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
SequenceID string `json:"sequence_id"`
|
|
Etag string `json:"etag"`
|
|
SHA1 string `json:"sha1"`
|
|
Name string `json:"name"`
|
|
Size float64 `json:"size"` // box returns this in xEyy format for very large numbers - see #2261
|
|
CreatedAt Time `json:"created_at"`
|
|
ModifiedAt Time `json:"modified_at"`
|
|
ContentCreatedAt Time `json:"content_created_at"`
|
|
ContentModifiedAt Time `json:"content_modified_at"`
|
|
ItemStatus string `json:"item_status"` // active, trashed if the file has been moved to the trash, and deleted if the file has been permanently deleted
|
|
SharedLink struct {
|
|
URL string `json:"url,omitempty"`
|
|
Access string `json:"access,omitempty"`
|
|
} `json:"shared_link"`
|
|
OwnedBy struct {
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Login string `json:"login"`
|
|
} `json:"owned_by"`
|
|
}
|
|
|
|
// ModTime returns the modification time of the item
|
|
func (i *Item) ModTime() (t time.Time) {
|
|
t = time.Time(i.ContentModifiedAt)
|
|
if t.IsZero() {
|
|
t = time.Time(i.ModifiedAt)
|
|
}
|
|
return t
|
|
}
|
|
|
|
// FolderItems is returned from the GetFolderItems call
|
|
type FolderItems struct {
|
|
TotalCount int `json:"total_count"`
|
|
Entries []Item `json:"entries"`
|
|
Offset int `json:"offset"`
|
|
Limit int `json:"limit"`
|
|
NextMarker *string `json:"next_marker,omitempty"`
|
|
Order []struct {
|
|
By string `json:"by"`
|
|
Direction string `json:"direction"`
|
|
} `json:"order"`
|
|
}
|
|
|
|
// Parent defined the ID of the parent directory
|
|
type Parent struct {
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// CreateFolder is the request for Create Folder
|
|
type CreateFolder struct {
|
|
Name string `json:"name"`
|
|
Parent Parent `json:"parent"`
|
|
}
|
|
|
|
// UploadFile is the request for Upload File
|
|
type UploadFile struct {
|
|
Name string `json:"name"`
|
|
Parent Parent `json:"parent"`
|
|
ContentCreatedAt Time `json:"content_created_at"`
|
|
ContentModifiedAt Time `json:"content_modified_at"`
|
|
}
|
|
|
|
// PreUploadCheck is the request for upload preflight check
|
|
type PreUploadCheck struct {
|
|
Name string `json:"name"`
|
|
Parent Parent `json:"parent"`
|
|
Size *int64 `json:"size,omitempty"`
|
|
}
|
|
|
|
// PreUploadCheckResponse is the response from upload preflight check
|
|
// if successful
|
|
type PreUploadCheckResponse struct {
|
|
UploadToken string `json:"upload_token"`
|
|
UploadURL string `json:"upload_url"`
|
|
}
|
|
|
|
// PreUploadCheckConflict is returned in the ContextInfo error field
|
|
// from PreUploadCheck when the error code is "item_name_in_use"
|
|
type PreUploadCheckConflict struct {
|
|
Conflicts struct {
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
FileVersion struct {
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
Sha1 string `json:"sha1"`
|
|
} `json:"file_version"`
|
|
SequenceID string `json:"sequence_id"`
|
|
Etag string `json:"etag"`
|
|
Sha1 string `json:"sha1"`
|
|
Name string `json:"name"`
|
|
} `json:"conflicts"`
|
|
}
|
|
|
|
// UpdateFileModTime is used in Update File Info
|
|
type UpdateFileModTime struct {
|
|
ContentModifiedAt Time `json:"content_modified_at"`
|
|
}
|
|
|
|
// UpdateFileMove is the request for Upload File to change name and parent
|
|
type UpdateFileMove struct {
|
|
Name string `json:"name"`
|
|
Parent Parent `json:"parent"`
|
|
}
|
|
|
|
// CopyFile is the request for Copy File
|
|
type CopyFile struct {
|
|
Name string `json:"name"`
|
|
Parent Parent `json:"parent"`
|
|
}
|
|
|
|
// CreateSharedLink is the request for Public Link
|
|
type CreateSharedLink struct {
|
|
SharedLink struct {
|
|
URL string `json:"url,omitempty"`
|
|
Access string `json:"access,omitempty"`
|
|
} `json:"shared_link"`
|
|
}
|
|
|
|
// UploadSessionRequest is uses in Create Upload Session
|
|
type UploadSessionRequest struct {
|
|
FolderID string `json:"folder_id,omitempty"` // don't pass for update
|
|
FileSize int64 `json:"file_size"`
|
|
FileName string `json:"file_name,omitempty"` // optional for update
|
|
}
|
|
|
|
// UploadSessionResponse is returned from Create Upload Session
|
|
type UploadSessionResponse struct {
|
|
TotalParts int `json:"total_parts"`
|
|
PartSize int64 `json:"part_size"`
|
|
SessionEndpoints struct {
|
|
ListParts string `json:"list_parts"`
|
|
Commit string `json:"commit"`
|
|
UploadPart string `json:"upload_part"`
|
|
Status string `json:"status"`
|
|
Abort string `json:"abort"`
|
|
} `json:"session_endpoints"`
|
|
SessionExpiresAt Time `json:"session_expires_at"`
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
NumPartsProcessed int `json:"num_parts_processed"`
|
|
}
|
|
|
|
// Part defines the return from upload part call which are passed to commit upload also
|
|
type Part struct {
|
|
PartID string `json:"part_id"`
|
|
Offset int64 `json:"offset"`
|
|
Size int64 `json:"size"`
|
|
Sha1 string `json:"sha1"`
|
|
}
|
|
|
|
// UploadPartResponse is returned from the upload part call
|
|
type UploadPartResponse struct {
|
|
Part Part `json:"part"`
|
|
}
|
|
|
|
// CommitUpload is used in the Commit Upload call
|
|
type CommitUpload struct {
|
|
Parts []Part `json:"parts"`
|
|
Attributes struct {
|
|
ContentCreatedAt Time `json:"content_created_at"`
|
|
ContentModifiedAt Time `json:"content_modified_at"`
|
|
} `json:"attributes"`
|
|
}
|
|
|
|
// ConfigJSON defines the shape of a box config.json
|
|
type ConfigJSON struct {
|
|
BoxAppSettings AppSettings `json:"boxAppSettings"`
|
|
EnterpriseID string `json:"enterpriseID"`
|
|
}
|
|
|
|
// AppSettings defines the shape of the boxAppSettings within box config.json
|
|
type AppSettings struct {
|
|
ClientID string `json:"clientID"`
|
|
ClientSecret string `json:"clientSecret"`
|
|
AppAuth AppAuth `json:"appAuth"`
|
|
}
|
|
|
|
// AppAuth defines the shape of the appAuth within boxAppSettings in config.json
|
|
type AppAuth struct {
|
|
PublicKeyID string `json:"publicKeyID"`
|
|
PrivateKey string `json:"privateKey"`
|
|
Passphrase string `json:"passphrase"`
|
|
}
|
|
|
|
// User is returned from /users/me
|
|
type User struct {
|
|
Type string `json:"type"`
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Login string `json:"login"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
ModifiedAt time.Time `json:"modified_at"`
|
|
Language string `json:"language"`
|
|
Timezone string `json:"timezone"`
|
|
SpaceAmount int64 `json:"space_amount"`
|
|
SpaceUsed int64 `json:"space_used"`
|
|
MaxUploadSize int64 `json:"max_upload_size"`
|
|
Status string `json:"status"`
|
|
JobTitle string `json:"job_title"`
|
|
Phone string `json:"phone"`
|
|
Address string `json:"address"`
|
|
AvatarURL string `json:"avatar_url"`
|
|
}
|