ScannerVision Web Server

<back to all web services

GetQuestion

Requires Authentication
The following routes are available for this service:
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}/page/{PageNumber}
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}/{ParsedRoot*}/folder/revisited/{FolderBrowser*}
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}/{ParsedRoot*}/folder/revisited/{FolderBrowser*}/page/{PageNumber}
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}/{ParsedRoot*}/folder/revisited/{FolderBrowser*}/search/{SearchTerm}
GET/{Brand}/question/{TemplateGuid}/{QuestionGuid}/{ParsedRoot*}/folder/revisited/{FolderBrowser*}/search/{SearchTerm}/page/{PageNumber}
import Foundation
import ServiceStack

public class GetQuestion : QuestionRequestDto
{
    public var parsedRoot:String
    public var searchTerm:String
    public var pageNumber:Int

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case parsedRoot
        case searchTerm
        case pageNumber
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        parsedRoot = try container.decodeIfPresent(String.self, forKey: .parsedRoot)
        searchTerm = try container.decodeIfPresent(String.self, forKey: .searchTerm)
        pageNumber = try container.decodeIfPresent(Int.self, forKey: .pageNumber)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if parsedRoot != nil { try container.encode(parsedRoot, forKey: .parsedRoot) }
        if searchTerm != nil { try container.encode(searchTerm, forKey: .searchTerm) }
        if pageNumber != nil { try container.encode(pageNumber, forKey: .pageNumber) }
    }
}

public class QuestionRequestDto : RequestBase
{
    public var templateGuid:String
    public var questionGuid:String
    public var parent:String
    public var folderBrowser:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case templateGuid
        case questionGuid
        case parent
        case folderBrowser
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        templateGuid = try container.decodeIfPresent(String.self, forKey: .templateGuid)
        questionGuid = try container.decodeIfPresent(String.self, forKey: .questionGuid)
        parent = try container.decodeIfPresent(String.self, forKey: .parent)
        folderBrowser = try container.decodeIfPresent(String.self, forKey: .folderBrowser)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if templateGuid != nil { try container.encode(templateGuid, forKey: .templateGuid) }
        if questionGuid != nil { try container.encode(questionGuid, forKey: .questionGuid) }
        if parent != nil { try container.encode(parent, forKey: .parent) }
        if folderBrowser != nil { try container.encode(folderBrowser, forKey: .folderBrowser) }
    }
}

public class RequestBase : DtoBase
{
    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)
    }
}

public class DtoBase : Codable
{
    public var brand:Brand

    required public init(){}
}

public enum Brand : String, Codable
{
    case Desktop
    case Hp
    case Kyocera
    case NeaScan
    case Samsung
    case FujiXerox
    case Ta
    case Utax
    case Epson
    case ScanFront400
    case Sharp
    case Ricoh
    case FujiFilm
}

public class GetQuestionResponse : ScanResponseBase
{
    //question:IClientQuestion ignored. Swift doesn't support interface properties
    public var regexMatches:Bool
    public var regexHint:String
    public var selectedFolder:String
    //loggedInUser:IUser ignored. Swift doesn't support interface properties
    //metadataParser:IMetadataParserEx ignored. Swift doesn't support interface properties
    public var parsedRoot:String
    public var folderBrowser:String
    public var parent:String
    public var searchTerm:String
    public var pageNumber:Int?

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case question
        case regexMatches
        case regexHint
        case selectedFolder
        case loggedInUser
        case metadataParser
        case parsedRoot
        case folderBrowser
        case parent
        case searchTerm
        case pageNumber
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        question = try container.decodeIfPresent(IClientQuestion.self, forKey: .question)
        regexMatches = try container.decodeIfPresent(Bool.self, forKey: .regexMatches)
        regexHint = try container.decodeIfPresent(String.self, forKey: .regexHint)
        selectedFolder = try container.decodeIfPresent(String.self, forKey: .selectedFolder)
        loggedInUser = try container.decodeIfPresent(IUser.self, forKey: .loggedInUser)
        metadataParser = try container.decodeIfPresent(IMetadataParserEx.self, forKey: .metadataParser)
        parsedRoot = try container.decodeIfPresent(String.self, forKey: .parsedRoot)
        folderBrowser = try container.decodeIfPresent(String.self, forKey: .folderBrowser)
        parent = try container.decodeIfPresent(String.self, forKey: .parent)
        searchTerm = try container.decodeIfPresent(String.self, forKey: .searchTerm)
        pageNumber = try container.decodeIfPresent(Int.self, forKey: .pageNumber)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if question != nil { try container.encode(question, forKey: .question) }
        if regexMatches != nil { try container.encode(regexMatches, forKey: .regexMatches) }
        if regexHint != nil { try container.encode(regexHint, forKey: .regexHint) }
        if selectedFolder != nil { try container.encode(selectedFolder, forKey: .selectedFolder) }
        if loggedInUser != nil { try container.encode(loggedInUser, forKey: .loggedInUser) }
        if metadataParser != nil { try container.encode(metadataParser, forKey: .metadataParser) }
        if parsedRoot != nil { try container.encode(parsedRoot, forKey: .parsedRoot) }
        if folderBrowser != nil { try container.encode(folderBrowser, forKey: .folderBrowser) }
        if parent != nil { try container.encode(parent, forKey: .parent) }
        if searchTerm != nil { try container.encode(searchTerm, forKey: .searchTerm) }
        if pageNumber != nil { try container.encode(pageNumber, forKey: .pageNumber) }
    }
}

public class ScanResponseBase : ResponseBase
{
    //template:IClientTemplate ignored. Swift doesn't support interface properties
    public var globalQuestions:[IClientQuestion] = []
    public var canEnableScanButton:Bool

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case template
        case globalQuestions
        case canEnableScanButton
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        template = try container.decodeIfPresent(IClientTemplate.self, forKey: .template)
        globalQuestions = try container.decodeIfPresent([IClientQuestion].self, forKey: .globalQuestions) ?? []
        canEnableScanButton = try container.decodeIfPresent(Bool.self, forKey: .canEnableScanButton)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if template != nil { try container.encode(template, forKey: .template) }
        if globalQuestions.count > 0 { try container.encode(globalQuestions, forKey: .globalQuestions) }
        if canEnableScanButton != nil { try container.encode(canEnableScanButton, forKey: .canEnableScanButton) }
    }
}

public class ResponseBase : DtoBase
{
    public var selectedUiLanguage:String
    public var svSession:String
    public var title:String
    public var pageTip:String
    public var newBrowser:Bool
    public var scanFront400TA:Bool
    public var scanFront400UTAX:Bool

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case selectedUiLanguage
        case svSession
        case title
        case pageTip
        case newBrowser
        case scanFront400TA
        case scanFront400UTAX
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        selectedUiLanguage = try container.decodeIfPresent(String.self, forKey: .selectedUiLanguage)
        svSession = try container.decodeIfPresent(String.self, forKey: .svSession)
        title = try container.decodeIfPresent(String.self, forKey: .title)
        pageTip = try container.decodeIfPresent(String.self, forKey: .pageTip)
        newBrowser = try container.decodeIfPresent(Bool.self, forKey: .newBrowser)
        scanFront400TA = try container.decodeIfPresent(Bool.self, forKey: .scanFront400TA)
        scanFront400UTAX = try container.decodeIfPresent(Bool.self, forKey: .scanFront400UTAX)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if selectedUiLanguage != nil { try container.encode(selectedUiLanguage, forKey: .selectedUiLanguage) }
        if svSession != nil { try container.encode(svSession, forKey: .svSession) }
        if title != nil { try container.encode(title, forKey: .title) }
        if pageTip != nil { try container.encode(pageTip, forKey: .pageTip) }
        if newBrowser != nil { try container.encode(newBrowser, forKey: .newBrowser) }
        if scanFront400TA != nil { try container.encode(scanFront400TA, forKey: .scanFront400TA) }
        if scanFront400UTAX != nil { try container.encode(scanFront400UTAX, forKey: .scanFront400UTAX) }
    }
}

public protocol IClientTemplate
{
    var Description:String { get set }
    var icon:[UInt8] { get set }
    //modificationInfo:ITemplateModificationInfo ignored. Swift doesn't support interface properties
    var name:String { get set }
    var questions:[IClientQuestion] { get set }
    //template:ITemplate ignored. Swift doesn't support interface properties
    var templateGuid:String { get set }

}

public protocol ITemplateModificationInfo
{
    var guid:String { get set }
    var templateModificationDateTime:Date { get set }
    var iconModificationDateTime:Date { get set }

}

public protocol IClientQuestion : ITemplateQuestion
{
    var questionGuid:String { get set }
    var valueDisplayed:String { get set }
    var valueReturned:String { get set }
    var answered:Bool { get set }
    var regexMatches:Bool { get set }
    var regexHint:String { get set }

}

public protocol ITemplate : IStatus
{
    var templateVersion:String { get set }
    var scannerVisionVersion:String { get set }
    var guid:String { get set }
    var beginScript:String { get set }
    var endScript:String { get set }
    var templateType:TemplateType { get set }
    //general:IGeneral ignored. Swift doesn't support interface properties
    //capture:ICapture ignored. Swift doesn't support interface properties
    //xmlMetadataImport:IXmlMetadataImport ignored. Swift doesn't support interface properties
    //notifications:INotifications ignored. Swift doesn't support interface properties
    //validator:IValidator ignored. Swift doesn't support interface properties

}

public enum TemplateType : String, Codable
{
    case Workflow
    case FreeForm
}

public protocol IGeneral : IInterface
{
    var name:String { get set }
    var Description:String { get set }
    var icon:String { get set }
    //schedule:ITemplateSchedule ignored. Swift doesn't support interface properties
    //rejection:IRejection ignored. Swift doesn't support interface properties
    //badDocumentRejection:IBadDocumentRejection ignored. Swift doesn't support interface properties
    var pdfLoadResolution:PdfLoadResolution? { get set }

}

public protocol ITemplateSchedule : IInterface
{
    var time:TimeInterval? { get set }
    var endTime:TimeInterval? { get set }
    var noEndTime:Bool? { get set }
    var type:TemplateScheduleType? { get set }

}

public enum TemplateScheduleType : String, Codable
{
    case Interval
    case Fixed
}

public protocol IRejection
{
    var rejectAfter:Int? { get set }
    var rejectionPath:String { get set }
    //shareCredentials:ICredentials ignored. Swift doesn't support interface properties

}

public protocol ICredentials : IInterface
{
    var username:String { get set }
    var password:String { get set }

}

public protocol IBadDocumentRejection : IStatus
{
    var rejectionPath:String { get set }
    //shareCredentials:ICredentials ignored. Swift doesn't support interface properties

}

public enum PdfLoadResolution : String, Codable
{
    case Default
    case Dpi100
    case Dpi150
    case Dpi200
    case Dpi300
    case Dpi400
    case Dpi500
    case Dpi600
}

public protocol ICapture : IInterface
{
    var captureSources:ReadOnlyCollection<ICaptureSource> { get set }

}

public protocol ICaptureSource : IStatus
{
}

public protocol IXmlMetadataImport : IStatus
{
    var sampleDocumentName:String { get set }
    var tagMappings:ReadOnlyCollection<IXmlMetadataImportTagMapping> { get set }
    var namespaceMappings:ReadOnlyCollection<IXmlMetadataImportNamespaceMapping> { get set }

}

public protocol IXmlMetadataImportTagMapping : IInterface
{
    var xPathExpression:String { get set }
    //metadata:IStringMetadata ignored. Swift doesn't support interface properties

}

public protocol IStringMetadata : IMetadata
{
    var isSecure:Bool? { get set }
    var sampleValue:String { get set }
    var value:String { get set }

}

public protocol IXmlMetadataImportNamespaceMapping : IInterface
{
    var `prefix`:String { get set }
    var name:String { get set }

}

public protocol INotifications : IStatus
{
    var notifications:ReadOnlyCollection<INotification> { get set }

}

public protocol INotification : IStatus
{
    var Description:String { get set }
    var to:String { get set }
    var subject:String { get set }
    var body:String { get set }
    var cc:String { get set }
    var bcc:String { get set }
    var notificationType:NotificationType? { get set }

}

public enum NotificationType : String, Codable
{
    case FailureOnly
    case SuccessOnly
    case Always
}

public protocol IValidator
{
    //validationErrors:IValidationErrors ignored. Swift doesn't support interface properties
    var isValid:Bool { get set }

}

public protocol IValidationErrors
{
    var errors:ReadOnlyCollection<IValidationError> { get set }

}

public protocol IValidationError
{
    var property:String { get set }
    var errorMessage:String { get set }

}

public protocol IUser : IIdTemplatesItem
{
    var groups:ReadOnlyCollection<IUserGroup> { get set }
    var emailAddress:String { get set }
    var hasPassword:Bool { get set }
    var homeFolder:String { get set }
    var password:String { get set }
    var sbcUser:Bool? { get set }

}

public protocol IUserGroup : IIdTemplatesItem, IGroup
{
    var users:ReadOnlyCollection<IUser> { get set }

}

public protocol IMetadataParserEx : IMetadataParser
{
}


Swift GetQuestion DTOs

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

HTTP + CSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

GET /{Brand}/question/{TemplateGuid}/{QuestionGuid} HTTP/1.1 
Host: buildmax.org 
Accept: text/csv
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length

{Unable to show example output for type 'GetQuestionResponse' using the custom 'csv' filter}No parameterless constructor defined for this object.