Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@ import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import io.writeopia.account.ui.SettingsDialog
import io.writeopia.auth.core.di.AuthCoreInjectionNeo
import io.writeopia.common.utils.Destinations
import io.writeopia.common.utils.NotesNavigation
import io.writeopia.common.utils.NotesNavigationType
import io.writeopia.di.AppConnectionInjection
import io.writeopia.documents.graph.di.DocumentsGraphInjection
import io.writeopia.editor.di.EditorKmpInjector
import io.writeopia.features.search.di.KmpSearchInjection
Expand Down Expand Up @@ -83,12 +81,6 @@ fun DesktopApp(
WriteopiaDbInjector.initialize(writeopiaDb)
}

LaunchedEffect("JWTToken") {
AuthCoreInjectionNeo.singleton().provideAuthRepository().getAuthToken()?.let { token ->
AppConnectionInjection.singleton().setJwtToken(token)
}
}

val editorInjector = remember {
EditorKmpInjector.desktop(
selectionState = selectionState,
Expand Down
1 change: 1 addition & 0 deletions application/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ kotlin {
implementation(project(":application:core:utils"))
implementation(project(":application:core:navigation"))
implementation(project(":application:core:documents"))
implementation(project(":application:core:connection"))

implementation(project(":plugins:writeopia_persistence_core"))
implementation(project(":plugins:writeopia_serialization"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import io.github.kdroidfilter.platformtools.darkmodedetector.isSystemInDarkMode
import io.github.kdroidfilter.platformtools.darkmodedetector.windows.setWindowsAdaptiveTitleBar
import io.writeopia.auth.core.di.AuthCoreInjectionNeo
import io.writeopia.auth.di.AuthInjection
import io.writeopia.auth.menu.AuthMenuViewModel
import io.writeopia.auth.navigation.authNavigation
import io.writeopia.common.utils.Destinations
import io.writeopia.common.utils.keyboard.KeyboardCommands
import io.writeopia.common.utils.keyboard.isMultiSelectionTrigger
import io.writeopia.common.utils.ui.GlobalToastBox
import io.writeopia.di.AppConnectionInjection
import io.writeopia.model.ColorThemeOption
import io.writeopia.model.isDarkTheme
import io.writeopia.notemenu.di.UiConfigurationInjector
Expand Down Expand Up @@ -241,6 +243,11 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
IntroScreen(colorTheme.value)

LaunchedEffect(Unit) {
AuthCoreInjectionNeo.singleton()
.provideAuthRepository()
.getAuthToken()
?.let(AppConnectionInjection.singleton()::setJwtToken)

authMenuViewModel.isLoggedIn().collect { loggedIn ->
delay(300)
navigationController.navigate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ class DocumentsSync(
val lastSync = documentRepository.loadDocumentById(folderId)?.lastSyncedAt

// First, receive the documents for the backend.
val response = documentsApi.getNewDocuments(folderId, lastSync ?: Instant.DISTANT_PAST)
val response = documentsApi.getNewDocuments(
folderId,
lastSync ?: Instant.DISTANT_PAST
)
val newDocuments = if (response is ResultData.Complete) response.data else return

// Then, load the outdated documents.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,116 +10,136 @@ CREATE TABLE document_entity (
icon TEXT,
icon_tint INTEGER,
is_locked BOOLEAN NOT NULL,
company_id TEXT NULL
company_id TEXT NULL,
deleted BOOLEAN NOT NULL
);

selectAll:
SELECT *
FROM document_entity;
FROM document_entity
WHERE deleted = FALSE;

selectLastUpdatedAt:
SELECT *
FROM document_entity
WHERE deleted = FALSE
ORDER BY last_synced
LIMIT 10;

selectTitleByDocumentId:
SELECT title
FROM document_entity
WHERE id = ?;
WHERE id = ? AND deleted = FALSE;

query:
SELECT *
FROM document_entity
WHERE title LIKE '%' || ? || '%'
WHERE title LIKE '%' || ? || '%' AND deleted = FALSE
ORDER BY last_synced;

selectById:
SELECT *
FROM document_entity
WHERE document_entity.id = ? AND user_id = ?
WHERE document_entity.id = ? AND user_id = ? AND deleted = FALSE
LIMIT 1;

selectWithContent:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE deleted = FALSE
ORDER BY position;

selectWithContentByIds:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.id IN ?
WHERE document_entity.id IN ? AND deleted = FALSE
ORDER BY position;

selectWithContentByUserId:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.user_id = ?
WHERE document_entity.user_id = ? AND deleted = FALSE
ORDER BY position;

selectFavoritesWithContentByUserId:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.user_id = ? AND document_entity.favorite = 1
WHERE document_entity.user_id = ? AND document_entity.favorite = 1 AND deleted = FALSE
ORDER BY position;

selectWithContentByUserIdAfterTime:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.user_id = ? AND last_synced > ?
WHERE document_entity.user_id = ? AND last_synced > ? AND deleted = FALSE
ORDER BY position;

selectWithContentByFolderIdAfterTime:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.parent_document_id = ? AND last_synced > ? AND user_id = ?
WHERE document_entity.parent_document_id = ? AND last_synced > ? AND user_id = ? AND deleted = FALSE
ORDER BY position;

selectWithContentById:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.id = ?
WHERE document_entity.id = ? AND deleted = FALSE
ORDER BY position;

selectWithContentByParentId:
SELECT *
FROM document_entity
LEFT JOIN story_step_entity ON document_entity.id=story_step_entity.document_id
WHERE document_entity.parent_document_id = ?
WHERE document_entity.parent_document_id = ? AND deleted = FALSE
ORDER BY position;

selectIdsByParentId:
SELECT id
FROM document_entity
WHERE document_entity.parent_document_id = ?;
WHERE document_entity.parent_document_id = ? AND deleted = FALSE;

insert:
INSERT INTO document_entity(id, title, created_at, last_updated_at, last_synced, user_id, favorite, parent_document_id, icon, icon_tint, is_locked, company_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
INSERT INTO document_entity(id, title, created_at, last_updated_at, last_synced, user_id, favorite, parent_document_id, icon, icon_tint, is_locked, company_id, deleted)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(id) DO
UPDATE SET id=excluded.id, title=excluded.title, created_at=excluded.created_at, last_updated_at=excluded.last_updated_at,
last_synced=excluded.last_synced, user_id=excluded.user_id, favorite=excluded.favorite,
parent_document_id=excluded.parent_document_id, icon=excluded.icon, icon_tint=excluded.icon_tint,
is_locked=excluded.is_locked, company_id=excluded.company_id;
is_locked=excluded.is_locked, company_id=excluded.company_id, deleted=excluded.deleted;

delete:
DELETE FROM document_entity WHERE id = ?;
UPDATE document_entity
SET
deleted = TRUE,
last_updated_at = ?
WHERE id = ?;

deleteByIds:
DELETE FROM document_entity WHERE id IN ?;
UPDATE document_entity
SET
deleted = TRUE,
last_updated_at = ?
WHERE id IN ?;

deleteByUserId:
DELETE FROM document_entity WHERE user_id = ?;
UPDATE document_entity
SET
deleted = TRUE,
last_updated_at = ?
WHERE user_id = ?;

deleteByFolderId:
DELETE FROM document_entity WHERE parent_document_id = ?;
UPDATE document_entity
SET
deleted = TRUE,
last_updated_at = ?
WHERE parent_document_id = ?;

favoriteById:
UPDATE document_entity SET favorite = 1 WHERE id = ?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ class DocumentSqlBeDao(
icon = document.icon?.label,
icon_tint = document.icon?.tint,
is_locked = document.isLocked,
company_id = ""
company_id = "",
deleted = false
)
}

Expand Down Expand Up @@ -484,12 +485,13 @@ class DocumentSqlBeDao(
}

fun deleteDocumentById(documentId: String) {
documentQueries?.delete(documentId)
val now = Clock.System.now().toEpochMilliseconds()
documentQueries?.delete(now, documentId)
storyStepQueries?.deleteByDocumentId(documentId)
}

fun deleteDocumentByIds(ids: Set<String>) {
documentQueries?.deleteByIds(ids)
documentQueries?.deleteByIds(Clock.System.now().toEpochMilliseconds(), ids)
storyStepQueries?.deleteByDocumentIds(ids)
}

Expand Down Expand Up @@ -633,11 +635,11 @@ class DocumentSqlBeDao(
?: emptyList()

fun deleteDocumentsByUserId(userId: String) {
documentQueries?.deleteByUserId(userId)
documentQueries?.deleteByUserId(Clock.System.now().toEpochMilliseconds(), userId)
}

fun deleteDocumentsByFolderId(folderId: String) {
documentQueries?.deleteByFolderId(folderId)
documentQueries?.deleteByFolderId(Clock.System.now().toEpochMilliseconds(), folderId)
}

fun favoriteById(documentId: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import io.writeopia.sdk.models.api.request.documents.FolderDiffRequest
import io.writeopia.sdk.serialization.extensions.toApi
import io.writeopia.sdk.serialization.extensions.toModel
import io.writeopia.sql.WriteopiaDbBackend
import kotlinx.datetime.Instant

fun Routing.documentsRoute(
writeopiaDb: WriteopiaDbBackend,
Expand Down Expand Up @@ -151,7 +152,7 @@ fun Routing.documentsRoute(
try {
println("loading diff")
println("user id: ${getUserId()}")
println("last sync: ${folderDiff.lastFolderSync}")
println("last sync: ${Instant.fromEpochMilliseconds(folderDiff.lastFolderSync)}")

val documents =
writeopiaDb.folderDiff(
Expand Down
3 changes: 2 additions & 1 deletion docker/postgres/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ CREATE TABLE document_entity (
icon TEXT,
icon_tint INTEGER,
is_locked BOOLEAN NOT NULL,
company_id TEXT NULL
company_id TEXT NULL,
deleted BOOLEAN NOT NULL
);

CREATE TABLE story_step_entity (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ actual object MarkdownToDocument {
parentId = parentId,
isLocked = false,
content = content,
isFavorite = false
isFavorite = false,
deleted = false
)
}
.map { it.toModel() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ class DocumentSqlDao(
icon_tint = document.icon?.tint?.toLong(),
is_locked = document.isLocked.toLong(),
user_id_ = userId,
company_id = companyId
company_id = companyId,
deleted = 0
)
}

Expand Down Expand Up @@ -482,12 +483,12 @@ class DocumentSqlDao(
}

suspend fun deleteDocumentById(documentId: String) {
documentQueries?.delete(documentId)
documentQueries?.delete(Clock.System.now().toEpochMilliseconds(), documentId)
storyStepQueries?.deleteByDocumentId(documentId)
}

suspend fun deleteDocumentByIds(ids: Set<String>) {
documentQueries?.deleteByIds(ids)
documentQueries?.deleteByIds(Clock.System.now().toEpochMilliseconds(), ids)
storyStepQueries?.deleteByDocumentIds(ids)
}

Expand Down Expand Up @@ -698,11 +699,11 @@ class DocumentSqlDao(
?: emptyList()

suspend fun deleteDocumentsByUserId(userId: String) {
documentQueries?.deleteByUserId(userId)
documentQueries?.deleteByUserId(Clock.System.now().toEpochMilliseconds(), userId)
}

suspend fun deleteDocumentsByFolderId(folderId: String) {
documentQueries?.deleteByFolderId(folderId)
documentQueries?.deleteByFolderId(Clock.System.now().toEpochMilliseconds(), folderId)
}

suspend fun favoriteById(documentId: String) {
Expand Down
Loading