enum AbacusFileUploadStatus {
    CANCELLED
    COMPLETE
    ERROR
    INIT
    QUARANTINED
    SCANNING
}

input AbacusInitiateUploadInput {
    fileSizeBytes: Int!
    filename: String!
    md5sum: String!
    metadata: JSON
    mimeType: String
    uploadType: String!
}

type AbacusInitiateUploadResponse {
    chunkSizeBytes: Int
    completeUrl: String
    expiresAt: String!
    fileKey: String!
    isMultipart: Boolean!
    parts: [AbacusMultipartPart]
    requiredHeaders: JSON
    uploadUrl: String
}

type AbacusMultipartPart {
    expiresAt: String!
    partNumber: Int!
    url: String!
}

type AbacusFileUploadDetail {
    completedAt: String
    createdAt: String
    createdBy: String
    deletedAt: String
    deletedBy: String
    errorMessage: String
    expiresAt: String
    fileKey: String!
    fileSizeBytes: Int!
    fileType: String
    fileUploadConfigId: Int!
    fileUploadId: Int!
    lastModified: String
    lastModifiedBy: String
    md5sum: String
    mimeType: String
    multipartUploadId: String
    originalFileName: String!
    s3Bucket: String!
    s3Key: String!
    statementPeriodAdjustmentFile: AbacusStatementPeriodAdjustmentFile
    totalParts: Int!
    uploadMetadata: JSON
    uploadStatus: AbacusFileUploadStatus!
}

type AbacusFileUploadDownloadResponse {
    downloadUrl: String!
    expiresIn: Int!
    fileName: String!
    fileSizeBytes: Int!
}

extend type Mutation {
    abacusInitiateFileUpload(input: AbacusInitiateUploadInput!): AbacusInitiateUploadResponse
    abacusCancelFileUpload(fileKey: String!): AbacusFileUploadDetail
}

extend type Query {
    abacusFileUpload(fileKey: String!, verbose: Boolean): AbacusFileUploadDetail
    abacusFileUploadDownload(fileKey: String!): AbacusFileUploadDownloadResponse
}
