Skip to content

Commit ab6dcc0

Browse files
committed
feat: add support for un-archiving multiple items
1 parent 70f7426 commit ab6dcc0

6 files changed

Lines changed: 65 additions & 2 deletions

File tree

src/main/kotlin/com/sakethh/linkora/data/repository/FoldersRepoImpl.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.sakethh.linkora.data.repository
33
import com.sakethh.linkora.domain.Result
44
import com.sakethh.linkora.domain.Route
55
import com.sakethh.linkora.domain.dto.IDBasedDTO
6-
import com.sakethh.linkora.domain.dto.MoveItemsDTO
76
import com.sakethh.linkora.domain.dto.NewItemResponseDTO
87
import com.sakethh.linkora.domain.dto.TimeStampBasedResponse
98
import com.sakethh.linkora.domain.dto.folder.*

src/main/kotlin/com/sakethh/linkora/data/repository/MultiActionRepoImpl.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.sakethh.linkora.domain.LinkType
55
import com.sakethh.linkora.domain.Result
66
import com.sakethh.linkora.domain.Route
77
import com.sakethh.linkora.domain.dto.*
8+
import com.sakethh.linkora.domain.dto.folder.MarkItemsRegularDTO
89
import com.sakethh.linkora.domain.model.WebSocketEvent
910
import com.sakethh.linkora.domain.repository.FoldersRepo
1011
import com.sakethh.linkora.domain.repository.MultiActionRepo
@@ -302,4 +303,49 @@ class MultiActionRepoImpl(
302303
Result.Failure(e)
303304
}
304305
}
306+
307+
override suspend fun markItemsAsRegular(markItemsRegularDTO: MarkItemsRegularDTO): Result<TimeStampBasedResponse> {
308+
return try {
309+
val eventTimestamp = Instant.now().epochSecond
310+
if (markItemsRegularDTO.foldersIds.isNotEmpty()) {
311+
FoldersTable.checkForLWWConflictAndThrow(
312+
id = markItemsRegularDTO.foldersIds.random(),
313+
timeStamp = markItemsRegularDTO.eventTimestamp,
314+
lastModifiedColumn = FoldersTable.lastModified
315+
)
316+
}
317+
if (markItemsRegularDTO.linkIds.isNotEmpty()) {
318+
LinksTable.checkForLWWConflictAndThrow(
319+
id = markItemsRegularDTO.linkIds.random(),
320+
timeStamp = markItemsRegularDTO.eventTimestamp,
321+
lastModifiedColumn = LinksTable.lastModified
322+
)
323+
}
324+
transaction {
325+
FoldersTable.update(where = {
326+
FoldersTable.id.inList(markItemsRegularDTO.foldersIds)
327+
}) {
328+
it[isFolderArchived] = false
329+
it[lastModified] = eventTimestamp
330+
}
331+
+LinksTable.update(where = {
332+
LinksTable.id.inList(markItemsRegularDTO.linkIds)
333+
}) {
334+
it[linkType] = LinkType.SAVED_LINK.name
335+
it[lastModified] = eventTimestamp
336+
}
337+
}.let {
338+
Result.Success(
339+
response = TimeStampBasedResponse(
340+
eventTimestamp = eventTimestamp, message = "Unarchived $it items."
341+
), webSocketEvent = WebSocketEvent(
342+
operation = Route.MultiAction.UNARCHIVE_MULTIPLE_ITEMS.name,
343+
payload = Json.encodeToJsonElement(markItemsRegularDTO.copy(eventTimestamp = eventTimestamp))
344+
)
345+
)
346+
}
347+
} catch (e: Exception) {
348+
Result.Failure(e)
349+
}
350+
}
305351
}

src/main/kotlin/com/sakethh/linkora/domain/Route.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ sealed interface Route {
1818
}
1919

2020
enum class MultiAction : Route {
21-
ARCHIVE_MULTIPLE_ITEMS, DELETE_MULTIPLE_ITEMS, MOVE_EXISTING_ITEMS, COPY_EXISTING_ITEMS
21+
ARCHIVE_MULTIPLE_ITEMS, DELETE_MULTIPLE_ITEMS, MOVE_EXISTING_ITEMS, COPY_EXISTING_ITEMS, UNARCHIVE_MULTIPLE_ITEMS
2222
}
2323
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.sakethh.linkora.domain.dto.folder
2+
3+
import com.sakethh.linkora.domain.dto.Correlation
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class MarkItemsRegularDTO(
8+
val foldersIds: List<Long>,
9+
val linkIds: List<Long>,
10+
val eventTimestamp: Long,
11+
val correlation: Correlation
12+
)

src/main/kotlin/com/sakethh/linkora/domain/repository/MultiActionRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package com.sakethh.linkora.domain.repository
33
import com.sakethh.linkora.domain.DeleteMultipleItemsDTO
44
import com.sakethh.linkora.domain.Result
55
import com.sakethh.linkora.domain.dto.*
6+
import com.sakethh.linkora.domain.dto.folder.MarkItemsRegularDTO
67

78
interface MultiActionRepo {
89
suspend fun archiveMultipleItems(archiveMultipleItemsDTO: ArchiveMultipleItemsDTO): Result<TimeStampBasedResponse>
10+
suspend fun markItemsAsRegular(markItemsRegularDTO: MarkItemsRegularDTO): Result<TimeStampBasedResponse>
911
suspend fun deleteMultipleItems(deleteMultipleItemsDTO: DeleteMultipleItemsDTO): Result<TimeStampBasedResponse>
1012
suspend fun moveMultipleItems(moveItemsDTO: MoveItemsDTO): Result<TimeStampBasedResponse>
1113
suspend fun copyMultipleItems(copyItemsDTO: CopyItemsDTO): Result<CopyItemsResponseDTO>

src/main/kotlin/com/sakethh/linkora/presentation/routing/http/MultiActionRouting.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.sakethh.linkora.domain.Route
66
import com.sakethh.linkora.domain.dto.ArchiveMultipleItemsDTO
77
import com.sakethh.linkora.domain.dto.CopyItemsDTO
88
import com.sakethh.linkora.domain.dto.MoveItemsDTO
9+
import com.sakethh.linkora.domain.dto.folder.MarkItemsRegularDTO
910
import com.sakethh.linkora.domain.repository.MultiActionRepo
1011
import com.sakethh.linkora.utils.respondWithResult
1112
import io.ktor.server.application.*
@@ -27,6 +28,9 @@ fun Application.multiActionRouting(multiActionRepo: MultiActionRepo) {
2728
post<CopyItemsDTO>(Route.MultiAction.COPY_EXISTING_ITEMS.name) {
2829
respondWithResult(multiActionRepo.copyMultipleItems(it))
2930
}
31+
post<MarkItemsRegularDTO>(Route.MultiAction.UNARCHIVE_MULTIPLE_ITEMS.name) {
32+
respondWithResult(multiActionRepo.markItemsAsRegular(it))
33+
}
3034
}
3135
}
3236
}

0 commit comments

Comments
 (0)