session-ios/SessionMessagingKit/Open Groups/Types/Endpoint.swift

198 lines
7.2 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
enum Endpoint {
// Utility
case onion
case batch
case sequence
case capabilities
// Rooms
case rooms
case room(String)
case roomPollInfo(String, Int64)
// Messages
case roomMessage(String)
case roomMessageIndividual(String, String)
case roomMessagesRecent(String)
case roomMessagesBefore(String, id: Int64)
case roomMessagesSince(String, seqNo: Int64)
// Pinning
case roomPinMessage(String, id: Int64)
case roomUnpinMessage(String, id: Int64)
case roomUnpinAll(String)
// Files
case roomFile(String)
case roomFileJson(String)
case roomFileIndividual(String, Int64)
case roomFileIndividualJson(String, Int64)
// Users
case userBan(String)
case userUnban(String)
case userPermission(String)
case userModerator(String)
case userDeleteMessages(String)
// Legacy endpoints (to be deprecated and removed)
case legacyFiles
case legacyFile(UInt64)
case legacyMessages
case legacyMessagesForServer(Int64)
case legacyDeletedMessages
case legacyModerators
case legacyBlockList
case legacyBlockListIndividual(String)
case legacyBanAndDeleteAll
case legacyCompactPoll(legacyAuth: Bool)
case legacyAuthToken(legacyAuth: Bool)
case legacyAuthTokenChallenge(legacyAuth: Bool)
case legacyAuthTokenClaim(legacyAuth: Bool)
case legacyRooms
case legacyRoomInfo(String)
case legacyRoomImage(String)
case legacyMemberCount(legacyAuth: Bool)
var path: String {
switch self {
// Utility
case .onion: return "oxen/v4/lsrpc"
case .batch: return "batch"
case .sequence: return "sequence"
case .capabilities: return "capabilities"
// Rooms
case .rooms: return "rooms"
case .room(let roomToken): return "room/\(roomToken)"
case .roomPollInfo(let roomToken, let infoUpdated): return "room/\(roomToken)/pollInfo/\(infoUpdated)"
// Messages
case .roomMessage(let roomToken):
return "room/\(roomToken)/message"
case .roomMessageIndividual(let roomToken, let messageId):
return "room/\(roomToken)/message/\(messageId)"
case .roomMessagesRecent(let roomToken):
return "room/\(roomToken)/messages/recent"
case .roomMessagesBefore(let roomToken, let messageId):
return "room/\(roomToken)/messages/before/\(messageId)"
case .roomMessagesSince(let roomToken, let seqNo):
return "room/\(roomToken)/messages/since/\(seqNo)"
// Pinning
case .roomPinMessage(let roomToken, let messageId):
return "room/\(roomToken)/pin/\(messageId)"
case .roomUnpinMessage(let roomToken, let messageId):
return "room/\(roomToken)/unpin/\(messageId)"
case .roomUnpinAll(let roomToken):
return "room/\(roomToken)/unpin/all"
// Files
case .roomFile(let roomToken): return "room/\(roomToken)/file"
case .roomFileJson(let roomToken): return "room/\(roomToken)/fileJSON"
case .roomFileIndividual(let roomToken, let fileId):
// Note: The 'fileName' value is ignored by the server and is only used to distinguish
// this from the 'Json' variant
let fileName: String = ""
return "room/\(roomToken)/file/\(fileId)/\(fileName)"
case .roomFileIndividualJson(let roomToken, let fileId):
return "room/\(roomToken)/file/\(fileId)"
// Users
case .userBan(let sessionId): return "user/\(sessionId)/ban"
case .userUnban(let sessionId): return "user/\(sessionId)/unban"
case .userPermission(let sessionId): return "user/\(sessionId)/permission"
case .userModerator(let sessionId): return "user/\(sessionId)/moderator"
case .userDeleteMessages(let sessionId): return "user/\(sessionId)/deleteMessages"
// Legacy endpoints (to be deprecated and removed)
// TODO: Look for a nicer way to prepend 'legacy'? (OnionRequestAPI messes with this but the new auth needs it to be correct... )
case .legacyFiles: return "legacy/files"
case .legacyFile(let fileId): return "legacy/files/\(fileId)"
case .legacyMessages: return "legacy/messages"
case .legacyMessagesForServer(let serverId): return "legacy/messages/\(serverId)"
case .legacyDeletedMessages: return "legacy/deleted_messages"
case .legacyModerators: return "legacy/moderators"
case .legacyBlockList: return "legacy/block_list"
case .legacyBlockListIndividual(let publicKey): return "legacy/block_list/\(publicKey)"
case .legacyBanAndDeleteAll: return "legacy/ban_and_delete_all"
case .legacyCompactPoll(let useLegacyAuth):
return "\(useLegacyAuth ? "" : "legacy/")compact_poll"
case .legacyAuthToken(let useLegacyAuth):
return "\(useLegacyAuth ? "" : "legacy/")auth_token"
case .legacyAuthTokenChallenge(let useLegacyAuth):
return "\(useLegacyAuth ? "" : "legacy/")auth_token_challenge"
case .legacyAuthTokenClaim(let useLegacyAuth):
return "\(useLegacyAuth ? "" : "legacy/")claim_auth_token"
case .legacyRooms: return "legacy/rooms"
case .legacyRoomInfo(let roomName): return "legacy/rooms/\(roomName)"
case .legacyRoomImage(let roomName): return "legacy/rooms/\(roomName)/image"
case .legacyMemberCount(let useLegacyAuth):
return "\(useLegacyAuth ? "" : "legacy/")member_count"
}
}
var useLegacyAuth: Bool {
switch self {
// File upload/download should use legacy auth
case .legacyFiles, .legacyFile, .legacyMessages,
.legacyMessagesForServer, .legacyDeletedMessages,
.legacyModerators, .legacyBlockList,
.legacyBlockListIndividual, .legacyBanAndDeleteAll:
return true
case .legacyCompactPoll(let useLegacyAuth),
.legacyAuthToken(let useLegacyAuth),
.legacyAuthTokenChallenge(let useLegacyAuth),
.legacyAuthTokenClaim(let useLegacyAuth),
.legacyMemberCount(let useLegacyAuth):
return useLegacyAuth
case .legacyRooms, .legacyRoomInfo, .legacyRoomImage:
return true
default: return false
}
}
}