diff --git a/api/src/main/kotlin/dev/msfjarvis/claw/api/ShioriApi.kt b/api/src/main/kotlin/dev/msfjarvis/claw/api/ShioriApi.kt new file mode 100644 index 00000000..7b8305db --- /dev/null +++ b/api/src/main/kotlin/dev/msfjarvis/claw/api/ShioriApi.kt @@ -0,0 +1,52 @@ +/* + * Copyright © 2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.api + +import android.annotation.SuppressLint +import dev.msfjarvis.claw.model.shiori.AuthRequest +import dev.msfjarvis.claw.model.shiori.AuthResponse +import dev.msfjarvis.claw.model.shiori.Bookmark +import dev.msfjarvis.claw.model.shiori.BookmarkRequest +import dev.msfjarvis.claw.model.shiori.BookmarksResponse +import dev.msfjarvis.claw.model.shiori.EditedBookmark +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.HTTP +import retrofit2.http.Header +import retrofit2.http.POST +import retrofit2.http.PUT + +private const val SESSION_ID_HEADER = "X-Session-Id" + +interface ShioriApi { + @POST("/api/login") suspend fun login(@Body body: AuthRequest): AuthResponse + + @SuppressLint("RetrofitUsage") // POST without a body is apparently fine? + @POST("/api/logout") + suspend fun logout(@Header(SESSION_ID_HEADER) sessionId: String) + + @GET("/api/bookmarks") + suspend fun getBookmarks(@Header(SESSION_ID_HEADER) sessionId: String): BookmarksResponse + + @POST("/api/bookmarks") + suspend fun addBookmark( + @Header(SESSION_ID_HEADER) sessionId: String, + @Body bookmarkRequest: BookmarkRequest, + ): Bookmark + + @PUT("/api/bookmarks") + suspend fun editBookmark( + @Header(SESSION_ID_HEADER) sessionId: String, + @Body bookmark: EditedBookmark, + ): Bookmark + + @HTTP(method = "DELETE", path = "/api/bookmarks", hasBody = true) + suspend fun deleteBookmark( + @Header(SESSION_ID_HEADER) sessionId: String, + @Body ids: List, + ): Int +} diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Account.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Account.kt new file mode 100644 index 00000000..cdd22cac --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Account.kt @@ -0,0 +1,18 @@ +/* + * Copyright © 2021-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class Account( + val id: Int, + val username: String, + val owner: Boolean, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthRequest.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthRequest.kt new file mode 100644 index 00000000..3ced4c9f --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthRequest.kt @@ -0,0 +1,19 @@ +/* + * Copyright © 2021-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class AuthRequest( + val username: String, + val password: String, + val remember: Boolean = true, + val owner: Boolean = false, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthResponse.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthResponse.kt new file mode 100644 index 00000000..2280dc62 --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/AuthResponse.kt @@ -0,0 +1,18 @@ +/* + * Copyright © 2022-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class AuthResponse( + val session: String, + val expires: String, + val account: Account, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Bookmark.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Bookmark.kt new file mode 100644 index 00000000..7c874fc5 --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Bookmark.kt @@ -0,0 +1,27 @@ +/* + * Copyright © 2021-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class Bookmark( + val id: Int, + val url: String, + val title: String, + val excerpt: String, + val author: String, + val public: Int, + val modified: String, + val imageURL: String, + val hasContent: Boolean, + val hasArchive: Boolean, + val tags: List, + val createArchive: Boolean, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarkRequest.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarkRequest.kt new file mode 100644 index 00000000..7b5b8f9a --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarkRequest.kt @@ -0,0 +1,21 @@ +/* + * Copyright © 2021-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class BookmarkRequest( + val url: String, + val createArchive: Boolean, + val public: Int, + val tags: List, + val title: String, + val excerpt: String, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarksResponse.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarksResponse.kt new file mode 100644 index 00000000..e4436857 --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/BookmarksResponse.kt @@ -0,0 +1,18 @@ +/* + * Copyright © 2022-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class BookmarksResponse( + val bookmarks: List, + val maxPage: Int, + val page: Int, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/EditedBookmark.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/EditedBookmark.kt new file mode 100644 index 00000000..6f5db401 --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/EditedBookmark.kt @@ -0,0 +1,27 @@ +/* + * Copyright © 2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable +@Poko +class EditedBookmark( + val id: Int, + val url: String? = null, + val title: String? = null, + val excerpt: String? = null, + val author: String? = null, + val public: Int? = null, + val modified: String? = null, + val imageURL: String? = null, + val hasContent: Boolean? = null, + val hasArchive: Boolean? = null, + val tags: List? = null, + val createArchive: Boolean? = null, +) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Tag.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Tag.kt new file mode 100644 index 00000000..138474fa --- /dev/null +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/shiori/Tag.kt @@ -0,0 +1,12 @@ +/* + * Copyright © 2022-2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.model.shiori + +import dev.drewhamilton.poko.Poko +import kotlinx.serialization.Serializable + +@Serializable @Poko class Tag(val name: String)