@@ -12,15 +12,19 @@ import com.sakethh.linkora.domain.tables.FoldersTable
1212import com.sakethh.linkora.domain.tables.LinksTable
1313import com.sakethh.linkora.domain.tables.helper.TombStoneHelper
1414import com.sakethh.linkora.utils.checkForLWWConflictAndThrow
15+ import com.sakethh.linkora.utils.copy
1516import kotlinx.coroutines.async
1617import kotlinx.coroutines.awaitAll
1718import kotlinx.coroutines.coroutineScope
1819import kotlinx.serialization.encodeToString
1920import kotlinx.serialization.json.Json
2021import kotlinx.serialization.json.encodeToJsonElement
21- import org.jetbrains.exposed.sql.*
2222import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
23+ import org.jetbrains.exposed.sql.and
24+ import org.jetbrains.exposed.sql.deleteWhere
25+ import org.jetbrains.exposed.sql.selectAll
2326import org.jetbrains.exposed.sql.transactions.transaction
27+ import org.jetbrains.exposed.sql.update
2428import java.time.Instant
2529
2630class MultiActionRepoImpl (
@@ -167,6 +171,7 @@ class MultiActionRepoImpl(
167171 lateinit var linkIds: List <Long >
168172 println (" Remote Links : ${copyItemsDTO.linkIds.values} " )
169173 // copy the links based on `copyItemsDTO.linkIds`
174+ val copiedFolderResponse = mutableListOf<CopiedFolderResponse >()
170175 transaction {
171176 this .exec(
172177 """
@@ -184,54 +189,106 @@ class MultiActionRepoImpl(
184189 }.toList()
185190
186191
192+
187193 // initially, we'll insert the root folders
188- lateinit var rootFolderIds : List <Long >
189- FoldersTable .selectAll().where {
194+ lateinit var copiedRootFolderIds : List <Long >
195+ val sourceRootFolders = FoldersTable .selectAll().where {
190196 FoldersTable .id.inList(copyItemsDTO.folders.map { it.currentFolder.remoteId })
191- }.toList().let { sourceRootFolders ->
192- sourceRootFolders.forEach {
193- println (it[FoldersTable .folderName] + " , " + it[FoldersTable .note] + " , " + it[FoldersTable .lastModified])
197+ }.toList()
198+ val eventTimestamp = Instant .now().epochSecond
199+
200+ copiedRootFolderIds = FoldersTable .copy(
201+ source = sourceRootFolders,
202+ eventTimestamp = eventTimestamp,
203+ parentFolderId = copyItemsDTO.newParentFolderId
204+ ).mapIndexed { index, resultRow ->
205+ resultRow[FoldersTable .id].value.run {
206+ copiedFolderResponse.add(
207+ CopiedFolderResponse (
208+ currentFolder = CurrentFolder (
209+ localId = copyItemsDTO.folders[index].currentFolder.localId, remoteId = this
210+ ), links = emptyList()
211+ )
212+ )
213+ this
194214 }
195- val eventTimestamp = Instant .now().epochSecond
196- println (" Index:" )
197- rootFolderIds = FoldersTable .batchInsert(sourceRootFolders) {
198- this [FoldersTable .folderName] = it[FoldersTable .folderName]
199- this [FoldersTable .lastModified] = eventTimestamp
200- this [FoldersTable .note] = it[FoldersTable .note]
201- this [FoldersTable .parentFolderID] = copyItemsDTO.newParentFolderId
202- this [FoldersTable .isFolderArchived] = it[FoldersTable .isFolderArchived]
203- }.toList().map { it[FoldersTable .id].value }
204215 }
205216
217+ // insert links of root folders
218+ copyItemsDTO.folders.map { it.currentFolder.remoteId }.forEachIndexed { folderIndex, folderId ->
219+ val sourceLinksOfRootFolder = LinksTable .selectAll().where {
220+ LinksTable .idOfLinkedFolder.eq(folderId)
221+ }.toList()
222+ val eventTimestamp = Instant .now().epochSecond
223+ LinksTable .copy(
224+ source = sourceLinksOfRootFolder,
225+ eventTimestamp = eventTimestamp,
226+ parentFolderId = copiedRootFolderIds[folderIndex]
227+ ).mapIndexed { linkResultRowIndex, resultRow ->
228+ FolderLink (
229+ localId = copyItemsDTO.folders[folderIndex].links[linkResultRowIndex].localId,
230+ remoteId = resultRow[LinksTable .id].value
231+ )
232+ }.let {
233+ copiedFolderResponse[folderIndex] = copiedFolderResponse[folderIndex].copy(
234+ links = it
235+ )
236+ }
237+ }
206238
207- fun insertChildFolders (parentFolderId : Long , childFolders : List <CopyFolderDTO >) {
208- FoldersTable .selectAll().where {
239+ fun insertChildFolders (
240+ parentFolderId : Long ,
241+ childFolders : List <CopyFolderDTO >,
242+ ) {
243+ val sourceFolders = FoldersTable .selectAll().where {
209244 FoldersTable .id.inList(childFolders.map { it.currentFolder.remoteId })
210- }.toList().let { sourceRootFolders ->
211- val eventTimestamp = Instant .now().epochSecond
212- FoldersTable .batchInsert(sourceRootFolders) {
213- this [FoldersTable .folderName] = it[FoldersTable .folderName]
214- this [FoldersTable .lastModified] = eventTimestamp
215- this [FoldersTable .note] = it[FoldersTable .note]
216- this [FoldersTable .parentFolderID] = parentFolderId
217- this [FoldersTable .isFolderArchived] = it[FoldersTable .isFolderArchived]
218- }.toList().forEachIndexed { resultRowIndex, resultRow ->
245+ }.toList()
246+ val eventTimestamp = Instant .now().epochSecond
247+ FoldersTable .copy(source = sourceFolders, eventTimestamp, parentFolderId)
248+ .forEachIndexed { insertedFolderRowIndex, insertedFolderRow ->
249+ val newParentFolderId = insertedFolderRow[FoldersTable .id].value
250+ val sourceParentFolderId = sourceFolders[insertedFolderRowIndex][FoldersTable .id].value
251+
252+ LinksTable .selectAll().where {
253+ LinksTable .idOfLinkedFolder.eq(sourceParentFolderId)
254+ }.let {
255+ LinksTable .copy(
256+ source = it.toList(),
257+ eventTimestamp = eventTimestamp,
258+ parentFolderId = newParentFolderId
259+ ).mapIndexed { insertedLinkRowIndex, insertedLinkRow ->
260+ FolderLink (
261+ localId = childFolders[insertedFolderRowIndex].links[insertedLinkRowIndex].localId,
262+ remoteId = insertedLinkRow[LinksTable .id].value
263+ )
264+ }.let {
265+ copiedFolderResponse.add(
266+ CopiedFolderResponse (
267+ currentFolder = CurrentFolder (
268+ localId = childFolders[insertedFolderRowIndex].currentFolder.localId,
269+ remoteId = newParentFolderId
270+ ), links = it
271+ )
272+ )
273+ }
274+ }
219275 insertChildFolders(
220- resultRow[ FoldersTable .id].value , childFolders[resultRowIndex ].childFolders
276+ newParentFolderId , childFolders[insertedFolderRowIndex ].childFolders
221277 )
222278 }
223- }
224279 }
280+
281+ // insert child folders
225282 copyItemsDTO.folders.forEachIndexed { index, parentFolder ->
226283 insertChildFolders(
227- rootFolderIds [index], parentFolder.childFolders
284+ copiedRootFolderIds [index], parentFolder.childFolders
228285 )
229286 }
230287
231288 }.let {
232289 Result .Success (
233290 response = CopyItemsResponseDTO (
234- folders = TODO (), linkIds = copyItemsDTO.linkIds.run {
291+ folders = copiedFolderResponse.toList (), linkIds = copyItemsDTO.linkIds.run {
235292 this .toList().mapIndexed { index, pair ->
236293 pair.first to linkIds[index]
237294 }.toMap()
0 commit comments