Skip to content

Commit f5dc287

Browse files
committed
feat: implement copying of links
1 parent 1b45e6e commit f5dc287

7 files changed

Lines changed: 67 additions & 11 deletions

File tree

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

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ import com.sakethh.linkora.domain.DeleteMultipleItemsDTO
44
import com.sakethh.linkora.domain.LinkType
55
import com.sakethh.linkora.domain.Result
66
import com.sakethh.linkora.domain.Route
7-
import com.sakethh.linkora.domain.dto.ArchiveMultipleItemsDTO
8-
import com.sakethh.linkora.domain.dto.IDBasedDTO
9-
import com.sakethh.linkora.domain.dto.MoveItemsDTO
10-
import com.sakethh.linkora.domain.dto.TimeStampBasedResponse
7+
import com.sakethh.linkora.domain.dto.*
118
import com.sakethh.linkora.domain.model.WebSocketEvent
129
import com.sakethh.linkora.domain.repository.FoldersRepo
1310
import com.sakethh.linkora.domain.repository.MultiActionRepo
@@ -22,6 +19,7 @@ import kotlinx.serialization.encodeToString
2219
import kotlinx.serialization.json.Json
2320
import kotlinx.serialization.json.encodeToJsonElement
2421
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
22+
import org.jetbrains.exposed.sql.and
2523
import org.jetbrains.exposed.sql.deleteWhere
2624
import org.jetbrains.exposed.sql.transactions.transaction
2725
import org.jetbrains.exposed.sql.update
@@ -164,4 +162,40 @@ class MultiActionRepoImpl(
164162
Result.Failure(e)
165163
}
166164
}
165+
166+
override suspend fun copyMultipleItems(copyItemsDTO: CopyItemsDTO): Result<CopyItemsResponseDTO> {
167+
return try {
168+
val eventTimestamp = Instant.now().epochSecond
169+
lateinit var linkIds: List<Long>
170+
171+
// copy the links based on `copyItemsDTO.linkIds`
172+
transaction {
173+
this.exec(
174+
"""
175+
INSERT INTO links_table (last_modified,link_type,link_title,url,base_url,img_url,note,id_of_linked_folder,user_agent,media_type,marked_as_important)
176+
SELECT $eventTimestamp AS last_modified,'${copyItemsDTO.linkType.name}' AS link_type,link_title,url,base_url,img_url,note,${copyItemsDTO.newParentFolderId} AS id_of_linked_folder,user_agent,media_type,marked_as_important FROM links_table
177+
WHERE id IN (${copyItemsDTO.linkIds.values.joinToString(separator = ",")});
178+
""".trimIndent()
179+
)
180+
linkIds = LinksTable.select(LinksTable.id).where {
181+
LinksTable.lastModified.eq(eventTimestamp) and LinksTable.linkType.eq(copyItemsDTO.linkType.name) and LinksTable.idOfLinkedFolder.eq(
182+
copyItemsDTO.newParentFolderId
183+
)
184+
}.map { resultRow ->
185+
resultRow[LinksTable.id].value
186+
}.toList()
187+
}
188+
Result.Success(
189+
response = CopyItemsResponseDTO(
190+
folderIds = copyItemsDTO.folderIds, linkIds = copyItemsDTO.linkIds.run {
191+
this.toList().mapIndexed { index, pair ->
192+
pair.first to linkIds[index]
193+
}.toMap()
194+
}, correlation = copyItemsDTO.correlation, eventTimestamp = eventTimestamp
195+
), webSocketEvent = null
196+
)
197+
} catch (e: Exception) {
198+
Result.Failure(e)
199+
}
200+
}
167201
}

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
21+
ARCHIVE_MULTIPLE_ITEMS, DELETE_MULTIPLE_ITEMS, MOVE_EXISTING_ITEMS, COPY_EXISTING_ITEMS
2222
}
2323
}
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.sakethh.linkora.domain
22

33
import com.sakethh.linkora.domain.dto.ArchiveMultipleItemsDTO
4-
import com.sakethh.linkora.domain.dto.MoveItemsDTO
54

65
typealias PlaceHolder = String
76

87
typealias PlaceHolderValue = String
98

10-
typealias CopyItemsDTO = MoveItemsDTO
11-
129
typealias DeleteMultipleItemsDTO = ArchiveMultipleItemsDTO
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.sakethh.linkora.domain.dto
2+
3+
import com.sakethh.linkora.domain.LinkType
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class CopyItemsDTO(
8+
val folderIds: Map<Long, Long>, // `key` belongs to the client, `value` belongs to this server's db
9+
val linkIds: Map<Long, Long>,// `key` belongs to the client, `value` belongs to this server's db
10+
val linkType: LinkType, val newParentFolderId: Long, val correlation: Correlation, val eventTimestamp: Long
11+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.sakethh.linkora.domain.dto
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class CopyItemsResponseDTO(
7+
val folderIds: Map<Long, Long>,
8+
val linkIds: Map<Long, Long>,
9+
val correlation: Correlation,
10+
val eventTimestamp: Long
11+
)

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ package com.sakethh.linkora.domain.repository
22

33
import com.sakethh.linkora.domain.DeleteMultipleItemsDTO
44
import com.sakethh.linkora.domain.Result
5-
import com.sakethh.linkora.domain.dto.ArchiveMultipleItemsDTO
6-
import com.sakethh.linkora.domain.dto.MoveItemsDTO
7-
import com.sakethh.linkora.domain.dto.TimeStampBasedResponse
5+
import com.sakethh.linkora.domain.dto.*
86

97
interface MultiActionRepo {
108
suspend fun archiveMultipleItems(archiveMultipleItemsDTO: ArchiveMultipleItemsDTO): Result<TimeStampBasedResponse>
119
suspend fun deleteMultipleItems(deleteMultipleItemsDTO: DeleteMultipleItemsDTO): Result<TimeStampBasedResponse>
1210
suspend fun moveMultipleItems(moveItemsDTO: MoveItemsDTO): Result<TimeStampBasedResponse>
11+
suspend fun copyMultipleItems(copyItemsDTO: CopyItemsDTO): Result<CopyItemsResponseDTO>
1312
}

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
@@ -4,6 +4,7 @@ import com.sakethh.linkora.Security
44
import com.sakethh.linkora.domain.DeleteMultipleItemsDTO
55
import com.sakethh.linkora.domain.Route
66
import com.sakethh.linkora.domain.dto.ArchiveMultipleItemsDTO
7+
import com.sakethh.linkora.domain.dto.CopyItemsDTO
78
import com.sakethh.linkora.domain.dto.MoveItemsDTO
89
import com.sakethh.linkora.domain.repository.MultiActionRepo
910
import com.sakethh.linkora.utils.respondWithResult
@@ -23,6 +24,9 @@ fun Application.multiActionRouting(multiActionRepo: MultiActionRepo) {
2324
post<MoveItemsDTO>(Route.MultiAction.MOVE_EXISTING_ITEMS.name) {
2425
respondWithResult(multiActionRepo.moveMultipleItems(it))
2526
}
27+
post<CopyItemsDTO>(Route.MultiAction.COPY_EXISTING_ITEMS.name) {
28+
respondWithResult(multiActionRepo.copyMultipleItems(it))
29+
}
2630
}
2731
}
2832
}

0 commit comments

Comments
 (0)