Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
244 changes: 131 additions & 113 deletions application/endpoints/src/main/resources/openapi/documentation.yaml

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions application/src/test/kotlin/TestFriends.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,20 @@ class TestFriends {
assertNull(user.relationship)
}

@Test
fun `test friend delete`() = runTestServer {
val self = generateTestAccount()
val friend = generateTestAccount()

self.friends.add(friend.id)
friend.friends.add(self.id)

require(self.friends.list(1.amount).data.first().id == friend.id)

self.friends.delete(friend.id)
require(self.friends.list(1.amount).data.isEmpty())
}

@Test
fun `test relationship property`() = runTestServer {
val self = generateTestAccount()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package app.meetacy.backend.core.endpoints

import app.meetacy.backend.types.serializable.serialization
import app.meetacy.backend.types.serializable.users.UserId
import io.ktor.http.*
import kotlinx.serialization.SerializationException


fun Parameters.friendIdOrNull(name: String = "friendId"): UserId? {
return this[name]?.let(::UserId)
}

fun Parameters.friendId(name: String = "friendId"): UserId = serialization {
val friendId = this[name] ?: throw SerializationException("Bad request. Illegal input: param 'friendId' is required for type with serial name, but it was missing at path: $name")
UserId(friendId)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package app.meetacy.backend.core.endpoints

import app.meetacy.backend.types.serializable.meetings.MeetingId
import app.meetacy.backend.types.serializable.serialization
import io.ktor.http.*
import kotlinx.serialization.SerializationException

fun Parameters.meetingIdOrNull(name: String = "meetingId"): MeetingId? {
return this[name]?.let(::MeetingId)
}

fun Parameters.meetingId(name: String = "meetingId"): MeetingId = serialization {
val meetingId = this[name] ?: throw SerializationException("Bad request. Illegal input: param 'meetingId' is required for type with serial name, but it was missing at path: $name")
MeetingId(meetingId)
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package app.meetacy.backend.core.endpoints

import app.meetacy.backend.types.serializable.serialization
import app.meetacy.backend.types.serializable.users.UserId
import io.ktor.http.*
import io.ktor.server.application.*
import kotlinx.serialization.SerializationException

fun Parameters.userIdOrNull(name: String = "userId"): UserId? {
return this[name]?.let(::UserId)
}

fun Parameters.userId(name: String = "userId"): UserId = serialization {
val userId = this[name] ?: throw SerializationException("Bad request. Illegal input: param 'userId' is required for type with serial name, but it was missing at path: $name")
UserId(userId)
}
Original file line number Diff line number Diff line change
@@ -1,36 +1,30 @@
package app.meetacy.backend.feature.friends.endpoints.delete

import app.meetacy.backend.core.endpoints.accessIdentity
import app.meetacy.backend.core.endpoints.friendId
import app.meetacy.backend.endpoint.ktor.Failure
import app.meetacy.backend.endpoint.ktor.respondFailure
import app.meetacy.backend.endpoint.ktor.respondSuccess
import app.meetacy.backend.types.serializable.access.AccessIdentity
import app.meetacy.backend.types.serializable.users.UserId as UserIdentitySerializable
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
import kotlinx.serialization.Serializable
import app.meetacy.backend.types.serializable.users.UserId as UserIdentitySerializable

interface DeleteFriendRepository {
suspend fun deleteFriend(token: AccessIdentity, friendId: UserIdentitySerializable): DeleteFriendResult
}

@Serializable
data class DeleteFriendParam(
val friendId: UserIdentitySerializable
)

sealed interface DeleteFriendResult {
data object Success : DeleteFriendResult
data object InvalidIdentity : DeleteFriendResult
data object FriendNotFound : DeleteFriendResult
}

fun Route.deleteFriend(provider: DeleteFriendRepository) = delete("/delete") {
val param = call.receive<DeleteFriendParam>()
val param = call.parameters.friendId()
val token = call.accessIdentity()

when (provider.deleteFriend(token, param.friendId)) {
when (provider.deleteFriend(token, param)) {
DeleteFriendResult.FriendNotFound -> call.respondFailure(Failure.FriendNotFound)
DeleteFriendResult.InvalidIdentity -> call.respondFailure(Failure.InvalidToken)
DeleteFriendResult.Success -> call.respondSuccess()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
package app.meetacy.backend.feature.meetings.endpoints.delete

import app.meetacy.backend.core.endpoints.accessIdentity
import app.meetacy.backend.core.endpoints.meetingId
import app.meetacy.backend.endpoint.ktor.Failure
import app.meetacy.backend.endpoint.ktor.respondFailure
import app.meetacy.backend.endpoint.ktor.respondSuccess
import app.meetacy.backend.types.serializable.access.AccessIdentity
import app.meetacy.backend.types.serializable.meetings.MeetingId
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
import kotlinx.serialization.Serializable

@Serializable
data class DeleteMeetingParam(
val meetingId: MeetingId
)

sealed interface DeleteMeetingResult {
data object Success : DeleteMeetingResult
Expand All @@ -27,9 +21,9 @@ interface DeleteMeetingRepository {
}

fun Route.deleteMeeting(repository: DeleteMeetingRepository) = delete("/delete") {
val param = call.receive<DeleteMeetingParam>()
val param = call.parameters.meetingId()
val token = call.accessIdentity()
when (repository.deleteMeeting(token, param.meetingId)) {
when (repository.deleteMeeting(token, param)) {
is DeleteMeetingResult.Success -> call.respondSuccess()
is DeleteMeetingResult.InvalidIdentity -> call.respondFailure(Failure.InvalidToken)
is DeleteMeetingResult.MeetingNotFound -> call.respondFailure(Failure.InvalidMeetingIdentity)
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ ssh = "2.10.1"
shadow = "7.0.0"

wdater = "0.0.4"
meetacySdk = "0.0.71-builde09e00c"
meetacySdk = "0.0.71-build80f4055"
meetacyDi = "0.0.25"

[libraries]
Expand Down