/* * Nextcloud Talk - Android Client * * SPDX-FileCopyrightText: 2021 Marcel Hibbe * SPDX-FileCopyrightText: 2021 Tim Krüger * SPDX-FileCopyrightText: 2017 Mario Danic * SPDX-License-Identifier: GPL-3.0-or-later */ package com.nextcloud.talk.api; import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall; import com.nextcloud.talk.models.json.capabilities.RoomCapabilitiesOverall; import com.nextcloud.talk.models.json.chat.ChatOverall; import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage; import com.nextcloud.talk.models.json.chat.ChatShareOverall; import com.nextcloud.talk.models.json.chat.ChatShareOverviewOverall; import com.nextcloud.talk.models.json.conversations.RoomOverall; import com.nextcloud.talk.models.json.conversations.RoomsOverall; import com.nextcloud.talk.models.json.generic.GenericOverall; import com.nextcloud.talk.models.json.generic.Status; import com.nextcloud.talk.models.json.hovercard.HoverCardOverall; import com.nextcloud.talk.models.json.invitation.InvitationOverall; import com.nextcloud.talk.models.json.mention.MentionOverall; import com.nextcloud.talk.models.json.notifications.NotificationOverall; import com.nextcloud.talk.models.json.opengraph.OpenGraphOverall; import com.nextcloud.talk.models.json.participants.AddParticipantOverall; import com.nextcloud.talk.models.json.participants.ParticipantsOverall; import com.nextcloud.talk.models.json.participants.TalkBan; import com.nextcloud.talk.models.json.participants.TalkBanOverall; import com.nextcloud.talk.models.json.push.PushRegistrationOverall; import com.nextcloud.talk.models.json.reactions.ReactionsOverall; import com.nextcloud.talk.models.json.reminder.ReminderOverall; import com.nextcloud.talk.models.json.search.ContactsByNumberOverall; import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; import com.nextcloud.talk.models.json.status.StatusOverall; import com.nextcloud.talk.models.json.unifiedsearch.UnifiedSearchOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall; import com.nextcloud.talk.models.json.userprofile.UserProfileOverall; import com.nextcloud.talk.polls.repositories.model.PollOverall; import com.nextcloud.talk.translate.repositories.model.LanguagesOverall; import com.nextcloud.talk.translate.repositories.model.TranslationsOverall; import java.util.List; import java.util.Map; import androidx.annotation.Nullable; import io.reactivex.Observable; import kotlin.Unit; import okhttp3.MultipartBody; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Response; import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.Field; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.HEAD; import retrofit2.http.Header; import retrofit2.http.Multipart; import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Part; import retrofit2.http.Query; import retrofit2.http.QueryMap; import retrofit2.http.Url; public interface NcApi { /* QueryMap items are as follows: - "format" : "json" - "search" : "" - "perPage" : "200" - "itemType" : "call" Server URL is: baseUrl + ocsApiVersion + /apps/files_sharing/api/v1/sharees or if we're on 14 and up: baseUrl + ocsApiVersion + "/core/autocomplete/get"); */ @GET Observable getContactsWithSearchParam(@Header("Authorization") String authorization, @Url String url, @Nullable @Query("shareTypes[]") List listOfShareTypes, @QueryMap Map options); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room */ @GET Observable getRooms(@Header("Authorization") String authorization, @Url String url, @Nullable @Query("includeStatus") Boolean includeStatus); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room/roomToken */ @GET Observable getRoom(@Header("Authorization") String authorization, @Url String url); /* QueryMap items are as follows: - "roomType" : "" - "invite" : "" Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room */ @POST Observable createRoom(@Header("Authorization") String authorization, @Url String url, @QueryMap Map options); /* QueryMap items are as follows: - "roomName" : "newName" Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room/roomToken */ @FormUrlEncoded @PUT Observable setConversationDescription(@Header("Authorization") String authorization, @Url String url, @Field("description") String description); /* QueryMap items are as follows: - "newParticipant" : "user" Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room/roomToken/participants */ @POST Observable addParticipant(@Header("Authorization") String authorization, @Url String url, @QueryMap Map options); @POST Observable resendParticipantInvitations(@Header("Authorization") String authorization, @Url String url); // also used for removing a guest from a conversation @Deprecated @DELETE Observable removeParticipantFromConversation(@Header("Authorization") String authorization, @Url String url, @Query("participant") String participantId); @DELETE Observable removeAttendeeFromConversation(@Header("Authorization") String authorization, @Url String url, @Query("attendeeId") Long attendeeId); @Deprecated @POST Observable promoteUserToModerator(@Header("Authorization") String authorization, @Url String url, @Query("participant") String participantId); @Deprecated @DELETE Observable demoteModeratorToUser(@Header("Authorization") String authorization, @Url String url, @Query("participant") String participantId); @POST Observable promoteAttendeeToModerator(@Header("Authorization") String authorization, @Url String url, @Query("attendeeId") Long attendeeId); @DELETE Observable demoteAttendeeFromModerator(@Header("Authorization") String authorization, @Url String url, @Query("attendeeId") Long attendeeId); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /room/roomToken/participants/self */ @DELETE Observable removeSelfFromRoom(@Header("Authorization") String authorization, @Url String url); @DELETE Observable deleteRoom(@Header("Authorization") String authorization, @Url String url); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken */ @GET Observable getPeersForCall(@Header("Authorization") String authorization, @Url String url); @GET Observable getPeersForCall(@Header("Authorization") String authorization, @Url String url, @QueryMap Map fields); @FormUrlEncoded @POST Observable joinRoom(@Nullable @Header("Authorization") String authorization, @Url String url, @Nullable @Field("password") String password); @DELETE Observable leaveRoom(@Nullable @Header("Authorization") String authorization, @Url String url); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken */ @FormUrlEncoded @POST Observable joinCall(@Nullable @Header("Authorization") String authorization, @Url String url, @Field("flags") Integer inCall, @Field("silent") Boolean callWithoutNotification, @Nullable @Field("recordingConsent") Boolean recordingConsent); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /call/callToken */ @DELETE Observable leaveCall(@Nullable @Header("Authorization") String authorization, @Url String url, @Nullable @Query("all") Boolean all); @GET Observable getSignalingSettings(@Nullable @Header("Authorization") String authorization, @Url String url); /* QueryMap items are as follows: - "messages" : "message" Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /signaling */ @FormUrlEncoded @POST Observable sendSignalingMessages(@Nullable @Header("Authorization") String authorization, @Url String url, @Field("messages") String messages); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /signaling */ @GET Observable pullSignalingMessages(@Nullable @Header("Authorization") String authorization, @Url String url); /* QueryMap items are as follows: - "format" : "json" Server URL is: baseUrl + ocsApiVersion + "/cloud/user" */ @GET Observable getUserProfile(@Header("Authorization") String authorization, @Url String url); @GET Observable getUserData(@Header("Authorization") String authorization, @Url String url); @DELETE Observable revertStatus(@Header("Authentication") String authorization, @Url String url); @FormUrlEncoded @PUT Observable setUserData(@Header("Authorization") String authorization, @Url String url, @Field("key") String key, @Field("value") String value); /* Server URL is: baseUrl + /status.php */ @GET Observable getServerStatus(@Url String url); /* QueryMap items are as follows: - "format" : "json" - "pushTokenHash" : "" - "devicePublicKey" : "" - "proxyServer" : "" Server URL is: baseUrl + ocsApiVersion + "/apps/notifications/api/v2/push */ @POST Observable registerDeviceForNotificationsWithNextcloud( @Header("Authorization") String authorization, @Url String url, @QueryMap Map options); @DELETE Observable unregisterDeviceForNotificationsWithNextcloud( @Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable registerDeviceForNotificationsWithPushProxy(@Url String url, @FieldMap Map fields); /* QueryMap items are as follows: - "deviceIdentifier": "{{deviceIdentifier}}", - "deviceIdentifierSignature": "{{signature}}", - "userPublicKey": "{{userPublicKey}}" */ @DELETE Observable unregisterDeviceForNotificationsWithProxy(@Url String url, @QueryMap Map fields); @GET Observable getCapabilities(@Header("Authorization") String authorization, @Url String url); @GET Observable getCapabilities(@Url String url); @GET Observable getRoomCapabilities(@Header("Authorization") String authorization, @Url String url); /* QueryMap items are as follows: - "lookIntoFuture": int (0 or 1), - "limit" : int, range 100-200, - "timeout": used with look into future, 30 default, 60 at most - "lastKnownMessageId", int, use one from X-Chat-Last-Given */ @GET Observable> pullChatMessages(@Header("Authorization") String authorization, @Url String url, @QueryMap Map fields); /* Fieldmap items are as follows: - "message": , - "actorDisplayName" */ @FormUrlEncoded @POST Observable sendChatMessage(@Header("Authorization") String authorization, @Url String url, @Field("message") CharSequence message, @Field("actorDisplayName") String actorDisplayName, @Field("replyTo") Integer replyTo, @Field("silent") Boolean sendWithoutNotification); @FormUrlEncoded @PUT Observable editChatMessage(@Header("Authorization") String authorization, @Url String url, @Field("message") String message); @GET Observable> getSharedItems( @Header("Authorization") String authorization, @Url String url, @Query("objectType") String objectType, @Nullable @Query("lastKnownMessageId") Integer lastKnownMessageId, @Nullable @Query("limit") Integer limit); @GET Observable> getSharedItemsOverview(@Header("Authorization") String authorization, @Url String url, @Nullable @Query("limit") Integer limit); @GET Observable getMentionAutocompleteSuggestions(@Header("Authorization") String authorization, @Url String url, @Query("search") String query, @Nullable @Query("limit") Integer limit, @QueryMap Map fields); // Url is: /api/{apiVersion}/room/{token}/pin @POST Observable addConversationToFavorites(@Header("Authorization") String authorization, @Url String url); // Url is: /api/{apiVersion}/room/{token}/favorites @DELETE Observable removeConversationFromFavorites(@Header("Authorization") String authorization, @Url String url); @GET Observable getNcNotification(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable setNotificationLevel(@Header("Authorization") String authorization, @Url String url, @Field("level") int level); @FormUrlEncoded @PUT Observable setConversationReadOnly(@Header("Authorization") String authorization, @Url String url, @Field("state") int state); @FormUrlEncoded @POST Observable createRemoteShare(@Nullable @Header("Authorization") String authorization, @Url String url, @Field("path") String remotePath, @Field("shareWith") String roomToken, @Field("shareType") String shareType, @Field("talkMetaData") String talkMetaData); @FormUrlEncoded @PUT Observable setLobbyForConversation(@Header("Authorization") String authorization, @Url String url, @Field("state") Integer state, @Field("timer") Long timer); @POST Observable searchContactsByPhoneNumber(@Header("Authorization") String authorization, @Url String url, @Body RequestBody search); @PUT Observable> uploadFile(@Header("Authorization") String authorization, @Url String url, @Body RequestBody body); @HEAD Observable> checkIfFileExists(@Header("Authorization") String authorization, @Url String url); @GET Call downloadFile(@Header("Authorization") String authorization, @Url String url); @DELETE Observable deleteChatMessage(@Header("Authorization") String authorization, @Url String url); @DELETE Observable deleteAvatar(@Header("Authorization") String authorization, @Url String url); @DELETE Observable deleteConversationAvatar(@Header("Authorization") String authorization, @Url String url); @Multipart @POST Observable uploadAvatar(@Header("Authorization") String authorization, @Url String url, @Part MultipartBody.Part attachment); @Multipart @POST Observable uploadConversationAvatar(@Header("Authorization") String authorization, @Url String url, @Part MultipartBody.Part attachment); @GET Observable getEditableUserProfileFields(@Header("Authorization") String authorization, @Url String url); @GET Call downloadResizedImage(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable sendLocation(@Header("Authorization") String authorization, @Url String url, @Field("objectType") String objectType, @Field("objectId") String objectId, @Field("metaData") String metaData); @DELETE Observable clearChatHistory(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable notificationCalls(@Header("Authorization") String authorization, @Url String url, @Field("level") Integer level); @GET Observable hoverCard(@Header("Authorization") String authorization, @Url String url); // Url is: /api/{apiVersion}/chat/{token}/read @FormUrlEncoded @POST Observable setChatReadMarker(@Header("Authorization") String authorization, @Url String url, @Nullable @Field("lastReadMessage") Integer lastReadMessage); // Url is: /api/{apiVersion}/chat/{token}/read @DELETE Observable markRoomAsUnread(@Header("Authorization") String authorization, @Url String url); /* Server URL is: baseUrl + ocsApiVersion + spreedApiVersion + /listed-room */ @GET Observable getOpenConversations(@Header("Authorization") String authorization, @Url String url); @GET Observable status(@Header("Authorization") String authorization, @Url String url); @GET Observable backupStatus(@Header("Authorization") String authorization, @Url String url); @GET Observable getPredefinedStatuses(@Header("Authorization") String authorization, @Url String url); @DELETE Observable statusDeleteMessage(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @PUT Observable setPredefinedStatusMessage(@Header("Authorization") String authorization, @Url String url, @Field("messageId") String selectedPredefinedMessageId, @Field("clearAt") Long clearAt); @FormUrlEncoded @PUT Observable setCustomStatusMessage(@Header("Authorization") String authorization, @Url String url, @Field("statusIcon") String statusIcon, @Field("message") String message, @Field("clearAt") Long clearAt); @FormUrlEncoded @PUT Observable setStatusType(@Header("Authorization") String authorization, @Url String url, @Field("statusType") String statusType); @POST Observable sendReaction(@Header("Authorization") String authorization, @Url String url, @Query("reaction") String reaction); @DELETE Observable deleteReaction(@Header("Authorization") String authorization, @Url String url, @Query("reaction") String reaction); @GET Observable getReactions(@Header("Authorization") String authorization, @Url String url, @Query("reaction") String reaction); @GET Observable performUnifiedSearch(@Header("Authorization") String authorization, @Url String url, @Query("term") String term, @Query("from") String fromUrl, @Query("limit") Integer limit, @Query("cursor") Integer cursor); @GET Observable getPoll(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable createPoll(@Header("Authorization") String authorization, @Url String url, @Query("question") String question, @Field("options[]") List options, @Query("resultMode") Integer resultMode, @Query("maxVotes") Integer maxVotes); @FormUrlEncoded @POST Observable votePoll(@Header("Authorization") String authorization, @Url String url, @Field("optionIds[]") List optionIds); @DELETE Observable closePoll(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable setMessageExpiration(@Header("Authorization") String authorization, @Url String url, @Field("seconds") Integer seconds); @GET Observable getOpenGraph(@Header("Authorization") String authorization, @Url String url, @Query("reference") String urlToFindPreviewFor); @FormUrlEncoded @POST Observable startRecording(@Header("Authorization") String authorization, @Url String url, @Field("status") Integer status); @DELETE Observable stopRecording(@Header("Authorization") String authorization, @Url String url); @POST Observable requestAssistance(@Header("Authorization") String authorization, @Url String url); @DELETE Observable withdrawRequestAssistance(@Header("Authorization") String authorization, @Url String url); @POST Observable sendCommonPostRequest(@Header("Authorization") String authorization, @Url String url); @DELETE Observable sendCommonDeleteRequest(@Header("Authorization") String authorization, @Url String url); @POST Observable translateMessage(@Header("Authorization") String authorization, @Url String url, @Query("text") String text, @Query("toLanguage") String toLanguage, @Nullable @Query("fromLanguage") String fromLanguage); @GET Observable getLanguages(@Header("Authorization") String authorization, @Url String url); @GET Observable getReminder(@Header("Authorization") String authorization, @Url String url); @DELETE Observable deleteReminder(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable setReminder(@Header("Authorization") String authorization, @Url String url, @Field("timestamp") int timestamp); @FormUrlEncoded @PUT Observable setRecordingConsent(@Header("Authorization") String authorization, @Url String url, @Field("recordingConsent") int recordingConsent); @GET Observable getInvitations(@Header("Authorization") String authorization, @Url String url); @POST Observable acceptInvitation(@Header("Authorization") String authorization, @Url String url); @DELETE Observable rejectInvitation(@Header("Authorization") String authorization, @Url String url); @GET Observable listBans(@Header("Authorization") String authorization, @Url String url); @FormUrlEncoded @POST Observable banActor(@Header("Authorization") String authorization, @Url String url, @Field("actorType") String actorType, @Field("actorId") String actorId, @Field("internalNote") String internalNote); @DELETE Observable unbanActor(@Header("Authorization") String authorization, @Url String url); }