Field Squared API Services

<back to all web services

PublicDocument

The following routes are available for this service:
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)
    }
}


Swift PublicDocument DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + 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: {}
			}
		}
	]
}