SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/api/push/ApiPushMastodon.kt

119 lines
3.9 KiB
Kotlin

package jp.juggler.subwaytooter.api.push
import jp.juggler.subwaytooter.api.authorizationBearer
import jp.juggler.subwaytooter.api.await
import jp.juggler.subwaytooter.api.readJsonObject
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.util.data.JsonObject
import jp.juggler.util.data.buildJsonObject
import jp.juggler.util.network.toPostRequestBuilder
import jp.juggler.util.network.toPutRequestBuilder
import okhttp3.OkHttpClient
import okhttp3.Request
class ApiPushMastodon(
private val okHttp: OkHttpClient,
) {
companion object {
val alertTypes = arrayOf(
"mention",
"status",
"reblog",
"follow",
"follow_request",
"favourite",
"poll",
"update",
"admin.sign_up",
"admin.report",
)
}
/**
* アクセストークンに設定されたプッシュ購読を見る
*/
suspend fun getPushSubscription(
a: SavedAccount,
): JsonObject = Request.Builder()
.url("https://${a.apiHost}/api/v1/push/subscription")
.authorizationBearer(a.bearerAccessToken)
.build()
.await(okHttp)
.readJsonObject()
/**
* アクセストークンに設定されたプッシュ購読を削除する
*/
suspend fun deletePushSubscription(
a: SavedAccount,
): JsonObject = Request.Builder()
.delete()
.url("https://${a.apiHost}/api/v1/push/subscription")
.authorizationBearer(a.bearerAccessToken)
.build()
.await(okHttp)
.readJsonObject()
/**
* アクセストークンに対してプッシュ購読を登録する
*/
suspend fun createPushSubscription(
a: SavedAccount,
// REQUIRED String. The endpoint URL that is called when a notification event occurs.
endpointUrl: String,
// REQUIRED String. User agent public key.
// Base64 encoded string of a public key from a ECDH keypair using the prime256v1 curve.
p256dh: String,
// REQUIRED String. Auth secret. Base64 encoded string of 16 bytes of random data.
auth: String,
// map of alert type to boolean, true to receive for alert type. false? null?
alerts: Map<String, Boolean>,
// whether to receive push notifications from all, followed, follower, or none users.
policy: String,
): JsonObject = buildJsonObject {
put("subscription", buildJsonObject {
put("endpoint", endpointUrl)
put("keys", buildJsonObject {
put("p256dh", p256dh)
put("auth", auth)
})
})
put("data", buildJsonObject {
put("alerts", buildJsonObject {
for (t in alertTypes) {
alerts[t]?.let { put(t, it) }
}
})
})
put("policy", policy)
}.toPostRequestBuilder()
.url("https://${a.apiHost}/api/v1/push/subscription")
.authorizationBearer(a.bearerAccessToken)
.build()
.await(okHttp)
.readJsonObject()
/**
* 購読のdata部分を更新する
*/
suspend fun updatePushSubscriptionData(
a: SavedAccount,
alerts: Map<String, Boolean>,
policy: String,
): JsonObject = buildJsonObject {
put("data", buildJsonObject {
put("alerts", buildJsonObject {
for (t in alertTypes) {
alerts[t]?.let { put(t, it) }
}
})
})
put("policy", policy)
}.toPutRequestBuilder()
.url("https://${a.apiHost}/api/v1/push/subscription")
.authorizationBearer(a.bearerAccessToken)
.build()
.await(okHttp)
.readJsonObject()
}