// // Announcement.swift // Pachyderm // // Created by Shadowfacts on 4/16/24. // import Foundation import WebURL public struct Announcement: Decodable, Sendable, Hashable, Identifiable { public let id: String public let content: String public let startsAt: Date? public let endsAt: Date? public let allDay: Bool public let publishedAt: Date public let updatedAt: Date public let read: Bool? public let mentions: [Account] public let statuses: [Status] public let tags: [Hashtag] public let emojis: [Emoji] public var reactions: [Reaction] public static func all() -> Request<[Announcement]> { return Request(method: .get, path: "/api/v1/announcements") } public static func dismiss(id: String) -> Request { return Request(method: .post, path: "/api/v1/announcements/\(id)/dismiss") } public static func react(id: String, name: String) -> Request { return Request(method: .put, path: "/api/v1/announcements/\(id)/reactions/\(name)") } public static func unreact(id: String, name: String) -> Request { return Request(method: .delete, path: "/api/v1/announcements/\(id)/reactions/\(name)") } enum CodingKeys: String, CodingKey { case id case content case startsAt = "starts_at" case endsAt = "ends_at" case allDay = "all_day" case publishedAt = "published_at" case updatedAt = "updated_at" case read case mentions case statuses case tags case emojis case reactions } } extension Announcement { public struct Account: Decodable, Sendable, Hashable { public let id: String public let username: String public let url: WebURL public let acct: String } } extension Announcement { public struct Status: Decodable, Sendable, Hashable { public let id: String public let url: WebURL } } extension Announcement { public struct Reaction: Decodable, Sendable, Hashable { public let name: String public var count: Int public var me: Bool? public let url: URL? public let staticURL: URL? public init(name: String, count: Int, me: Bool?, url: URL?, staticURL: URL?) { self.name = name self.count = count self.me = me self.url = url self.staticURL = staticURL } enum CodingKeys: String, CodingKey { case name case count case me case url case staticURL = "static_url" } } }