| GET | /{Workspace}/API/Document/Schema | ||
|---|---|---|---|
| GET, PUT, POST, DELETE | /{Workspace}/API/Document/{Id} | ||
| GET, PUT, POST, DELETE | /{Workspace}/API/Document | ||
| GET | /{Workspace}/API/Document/Schema/{DocumentType} |
import Foundation
import ServiceStack
// @DataContract
public class PublicDocument : Codable
{
// @DataMember
public var id:String
// @DataMember
public var workspace:String
// @DataMember
public var documentType:String
// @DataMember
public var document:Document
// @DataMember
public var documents:[Document] = []
required public init(){}
}
/**
* Represents a document associated with a task or user. To return multiple documents, call /{Workspace}/Document and pass in query parameter ids = comma separated list of document ids.
*/
public class Document : Codable
{
public var workspace:String
public var assignedWorkspace:String
public var objectId:String
public var versionId:String
public var basedOn:String
public var created:String
public var externalId:String
public var lastUpdated:String
public var type:String
public var name:String
public var title:String
public var data:[String:Object] = [:]
public var owner:ClassedItem
public var secondaryOwners:[ClassedItem] = []
public var location:Location
public var date:String
public var createdBy:String
public var percentComplete:Double
public var percentTotal:Int
public var percentDone:Int
public var rangeExceptions:[RangeExceptionItem] = []
public var submitted:Bool
public var schema:String
public var ownerData:DocumentOwnerData
required public init(){}
}
public class ClassedItem : Codable
{
public var objectId:String
public var `class`:String
public var versionId:String
public var ancestors:[String] = []
public var type:String
required public init(){}
}
public class Location : Codable
{
public var y:Double
public var x:Double
required public init(){}
}
public class RangeExceptionItem : Codable
{
public var binding:String
public var message:String
public var type:String
public var className:String
required public init(){}
}
public class DocumentOwnerData : Codable
{
public var ownerType:String
public var taskData:DocumentOwnerDataTask
public var assetData:DocumentOwnerDataAsset
required public init(){}
}
public class DocumentOwnerDataTask : Codable
{
public var objectId:String
public var name:String
public var status:String
public var taskType:String
public var lastUpdated:Date
public var created:Date
public var priority:Int?
public var rank:Double
public var firstTeam:Team
public var address:Address
public var customDataFields:[CustomDataField] = []
required public init(){}
}
/**
* Represents a DTO for a team in a workspace. Calls without an ObjectId will retrieve an array of all team objects for the workspace.
*/
public class Team : Codable
{
public var workspace:String
public var timeZone:String
public var objectId:String
public var externalId:String
public var versionId:String
public var basedOn:String
public var name:String
public var enabled:Bool
public var members:[DomainItem] = []
public var lead:DomainItem
public var parent:DomainItem
public var address:Address
public var data:[String:String] = [:]
public var teams:[String] = []
public var events:[EventItem] = []
public var createdBy:String
public var activeLaborTypes:[String:Object] = [:]
required public init(){}
}
public class DomainItem : Codable
{
public var workspace:String
public var objectId:String
public var versionId:String
public var lastUpdated:String
required public init(){}
}
public class Address : Codable
{
public var street:String
public var unit:String
public var city:String
public var state:String
public var zip:String
public var contactTitle:String
public var contactName:String
public var contactPhone:String
public var contactEmail:String
public var location:Location
public var siteName:String
public var geocodeFailed:Bool
public var country:String
required public init(){}
}
public class EventItem : Codable
{
public var objectId:String
public var date:String
public var location:Location
public var barcode:String
public var details:String
public var type:String
public var isScan:Bool
public var user:String
public var selectedBy:String
public var status:String
public var statusType:String
public var dateCreated:String
public var automatic:Bool
required public init(){}
}
public class Address : AddressBase
{
public var siteName:String
public var contactTitle:String
public var contactName:String
public var contactPhone:String
public var contactEmail:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case siteName
case contactTitle
case contactName
case contactPhone
case contactEmail
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
siteName = try container.decodeIfPresent(String.self, forKey: .siteName)
contactTitle = try container.decodeIfPresent(String.self, forKey: .contactTitle)
contactName = try container.decodeIfPresent(String.self, forKey: .contactName)
contactPhone = try container.decodeIfPresent(String.self, forKey: .contactPhone)
contactEmail = try container.decodeIfPresent(String.self, forKey: .contactEmail)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if siteName != nil { try container.encode(siteName, forKey: .siteName) }
if contactTitle != nil { try container.encode(contactTitle, forKey: .contactTitle) }
if contactName != nil { try container.encode(contactName, forKey: .contactName) }
if contactPhone != nil { try container.encode(contactPhone, forKey: .contactPhone) }
if contactEmail != nil { try container.encode(contactEmail, forKey: .contactEmail) }
}
}
public class AddressBase : Codable
{
public var id:String
public var addressLine1:String
public var addressLine2:String
public var city:String
public var state:String
public var zip:String
public var location:Location
public var name:String
public var nameSingleLine:String
public var nameSingleLine5DigitZip:String
public var hasValidLocation:Bool
public var geocodeFailed:Bool
public var geocodeResultCode:String
public var country:String
required public init(){}
}
public class Location : Codable
{
public var latitude:Double
public var longitude:Double
public var hasValidLocation:Bool
required public init(){}
}
public class CustomDataField : Codable
{
public var binding:String
public var label:String
//value:Object ignored. Type could not be extended in Swift
public var dataType:String
public var isReadOnly:Bool
public var isHidden:Bool
public var values:String
required public init(){}
}
public class DocumentOwnerDataAsset : Codable
{
public var objectId:String
public var name:String
public var assetType:String
public var lastUpdated:Date
public var created:Date
public var address:AddressBasic
public var customDataFields:[CustomDataField] = []
required public init(){}
}
public class AddressBasic : AddressBase
{
required public init(){ super.init() }
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
}
}
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /{Workspace}/API/Document/{Id} HTTP/1.1
Host: dev.fieldsquared.com
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length
{
Id: String,
Workspace: String,
DocumentType: String,
Document:
{
Name: String,
ExternalId: String,
Type: String,
OwnerId: String,
OwnerClass: String,
Lat: 0,
Lon: 0,
LastUpdated: String,
Created: String,
Date: String,
PercentComplete: 0,
PercentTotal: 0,
PercentDone: 0,
Data:
{
String: {}
}
},
Documents:
[
{
Name: String,
ExternalId: String,
Type: String,
OwnerId: String,
OwnerClass: String,
Lat: 0,
Lon: 0,
LastUpdated: String,
Created: String,
Date: String,
PercentComplete: 0,
PercentTotal: 0,
PercentDone: 0,
Data:
{
String: {}
}
}
]
}