Skip to content

Commit

Permalink
Add support for image descriptions
Browse files Browse the repository at this point in the history
  • Loading branch information
shadowfacts committed Aug 31, 2018
1 parent b365352 commit cfece30
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 9 deletions.
36 changes: 32 additions & 4 deletions Sources/MastodonKit/Payload.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,59 @@ import Foundation

enum Payload {
case parameters([Parameter]?)
case media(MediaAttachment?)
case formData(MediaAttachment?, [Parameter]?)
case empty
}

extension Payload {
private static let boundary = "MastodonKitBoundary"

var items: [URLQueryItem]? {
switch self {
case .parameters(let parameters): return parameters?.compactMap(toQueryItem)
case .media: return nil
case .formData: return nil
case .empty: return nil
}
}

var data: Data? {
switch self {
case .parameters(let parameters): return parameters?.compactMap(toString).joined(separator: "&").data(using: .utf8)
case .media(let mediaAttachment): return mediaAttachment.flatMap(Data.init)
case .formData(let mediaAttachment, let parameters):
var data = Data()
if let parameters = parameters {
for param in parameters {
guard let value = param.value else { continue }
data.append("--\(Payload.boundary)\r\n")
data.append("Content-Disposition: form-data; name=\"\(param.name)\"\r\n\r\n")
data.append("\(value)\r\n")
}
}

if let mediaAttachment = mediaAttachment,
let attachmentData = mediaAttachment.data {
data.append("--\(Payload.boundary)\r\n")
data.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(mediaAttachment.fileName)\"\r\n")
data.append("Content-Type: \(mediaAttachment.mimeType)\r\n\r\n")
data.append(attachmentData)
data.append("\r\n")
}

data.append("--\(Payload.boundary)--\r\n")
return data
case .empty: return nil
}
}

var type: String? {
switch self {
case .parameters(let parameters): return parameters.flatMap { _ in "application/x-www-form-urlencoded; charset=utf-8" }
case .media(let mediaAttachment): return mediaAttachment.flatMap { _ in "multipart/form-data; boundary=MastodonKitBoundary" }
case .formData(let mediaAttachment, let parameters):
if mediaAttachment != nil || parameters != nil {
return "multipart/form-data; boundary=\(Payload.boundary)"
} else {
return nil
}
case .empty: return nil
}
}
Expand Down
8 changes: 6 additions & 2 deletions Sources/MastodonKit/Requests/Media.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ public struct Media {
/// Uploads a media attachment.
///
/// - Parameter mediaAttachment: The media attachment to upload.
/// - Parameter description: A plain-text description of the media, for accessibility (420 chars, max)
/// - Returns: Request for `Attachment`.
public static func upload(media mediaAttachment: MediaAttachment) -> Request<Attachment> {
let method = HTTPMethod.post(.media(mediaAttachment))
public static func upload(media mediaAttachment: MediaAttachment, description: String? = nil) -> Request<Attachment> {
let parameters = [
Parameter(name: "description", value: description)
]
let method = HTTPMethod.post(.formData(mediaAttachment, parameters))
return Request<Attachment>(path: "/api/v1/media", method: method)
}
}
2 changes: 1 addition & 1 deletion Tests/MastodonKitTests/Foundation/URLRequestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class URLRequestTests: XCTestCase {
func testRequestWithValidHTTPBody() {
let url = URL(string: "https://mastodon.technology")!
let mediaData = Data()
let method = HTTPMethod.post(.media(.gif(mediaData)))
let method = HTTPMethod.post(.formData(.gif(mediaData)))
let request = Request<String>(path: "/string", method: method)

let urlRequest = URLRequest(url: url, request: request, accessToken: nil)
Expand Down
4 changes: 2 additions & 2 deletions Tests/MastodonKitTests/PayloadTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class PayloadTests: XCTestCase {
func testMediaWithValidValue() {
let imageData = "image data".data(using: .utf8)

let payload = Payload.media(.jpeg(imageData))
let payload = Payload.formData(.jpeg(imageData))

// Items
XCTAssertNil(payload.items)
Expand All @@ -58,7 +58,7 @@ class PayloadTests: XCTestCase {
}

func testMediaWithNilValue() {
let payload = Payload.media(nil)
let payload = Payload.formData(nil)

XCTAssertNil(payload.items)
XCTAssertNil(payload.data)
Expand Down

0 comments on commit cfece30

Please sign in to comment.