Skip to content
Closed
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
1 change: 1 addition & 0 deletions domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ dependencies {
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation(libs.kotlinx.datetime)
}
2 changes: 2 additions & 0 deletions domain/gradle.lockfile
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1=debugCompileClasspath,debugRu
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime:0.6.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath
org.jetbrains.kotlinx:kover-jvm-agent:0.9.1=koverJvmAgent
org.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath
org.jetbrains:annotations:23.0.0=debugCompileClasspath,debugRuntimeClasspath,debugUnitTestCompileClasspath,debugUnitTestRuntimeClasspath,releaseCompileClasspath,releaseRuntimeClasspath,releaseUnitTestCompileClasspath,releaseUnitTestRuntimeClasspath
Expand Down
49 changes: 47 additions & 2 deletions domain/src/main/java/com/itlab/domain/model/Note.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,52 @@
package com.itlab.domain.model

import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import java.util.UUID

data class Note(
val id: String = "",
val id: String = UUID.randomUUID().toString(),
val title: String = "",
val content: String = "",
val folderId: String? = null,
val contentItems: List<ContentItem> = emptyList(),
val createdAt: Instant = Clock.System.now(),
val updatedAt: Instant = Clock.System.now(),
val tags: Set<String> = emptySet(),
val isFavorite: Boolean = false,
)

sealed class ImageSource {
data class Local(val path: String) : ImageSource()
data class Remote(val url: String) : ImageSource()
}

sealed class ContentItem {
data class Text(
val text: String,
val format: TextFormat = TextFormat.PLAIN,
) : ContentItem()

data class Image(
val source: ImageSource,
val width: Int? = null,
val height: Int? = null,
) : ContentItem()

data class File(
val uri: String,
val mimeType: String,
val name: String,
val size: Long? = null,
) : ContentItem()

data class Link(
val url: String,
val title: String? = null,
) : ContentItem()
}

enum class TextFormat {
PLAIN,
MARKDOWN,
HTML,
}
13 changes: 13 additions & 0 deletions domain/src/main/java/com/itlab/domain/model/NoteFolder.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.itlab.domain.model

import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import java.util.UUID

data class NoteFolder(
val id: String = UUID.randomUUID().toString(),
val name: String,
val createdAt: Instant = Clock.System.now(),
val updatedAt: Instant = Clock.System.now(),
val metadata: Map<String, String> = emptyMap(),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.itlab.domain.repository

import com.itlab.domain.model.NoteFolder
import kotlinx.coroutines.flow.Flow

interface NoteFolderRepository {

fun observeFolders(): Flow<List<NoteFolder>>

suspend fun createFolder(folder: NoteFolder): String

suspend fun renameFolder(id: String, name: String)

suspend fun deleteFolder(id: String)
suspend fun getFolderById(id: String): NoteFolder?
suspend fun updateFolder(folder: NoteFolder)


}
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
package com.itlab.domain.repository

interface NotesRepository
import com.itlab.domain.model.Note
import kotlinx.coroutines.flow.Flow

interface NotesRepository {

fun observeNotes(): Flow<List<Note>>

fun observeNotesByFolder(folderId: String): Flow<List<Note>>

suspend fun getNoteById(id: String): Note?

suspend fun createNote(note: Note): String

suspend fun updateNote(note: Note)

suspend fun deleteNote(id: String)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.NoteFolder
import com.itlab.domain.repository.NoteFolderRepository
import kotlinx.datetime.Clock

class CreateFolderUseCase(private val repo: NoteFolderRepository) {
suspend operator fun invoke(folder: NoteFolder): String {
// discuss
val folder = folder.copy(createdAt = Clock.System.now())
return repo.createFolder(folder)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository
import kotlinx.datetime.Clock

class CreateNoteUseCase(private val repo: NotesRepository) {
suspend operator fun invoke(note: Note): String {
val note = note.copy(createdAt = Clock.System.now())
return repo.createNote(note)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.itlab.domain.usecase

import com.itlab.domain.repository.NoteFolderRepository

class DeleteFolderUseCase(private val repo: NoteFolderRepository) {
suspend operator fun invoke(id: String) { repo.deleteFolder(id) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.itlab.domain.usecase

import com.itlab.domain.repository.NotesRepository

class DeleteNoteUseCase(private val repo: NotesRepository) {
suspend operator fun invoke(noteId: String) {
repo.deleteNote(noteId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.NoteFolder
import com.itlab.domain.repository.NoteFolderRepository

class GetFolderUseCase(private val repo: NoteFolderRepository) {
suspend operator fun invoke(id: String): NoteFolder? = repo.getFolderById(id)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository

class GetNoteUseCase(private val repo: NotesRepository) {
suspend operator fun invoke(id: String): Note? = repo.getNoteById(id)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.itlab.domain.usecase
import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository
import com.itlab.domain.repository.NoteFolderRepository
import kotlinx.datetime.Clock

class MoveNoteToFolderUseCase(
private val notesRepo: NotesRepository,
private val folderRepo: NoteFolderRepository
) {
suspend operator fun invoke(folderId: String, noteId: String) {
val folder = folderRepo.getFolderById(folderId) ?: throw IllegalArgumentException("Folder not found: $folderId")
val note = notesRepo.getNoteById(noteId) ?: throw IllegalArgumentException("Note not found: $noteId")
val updated = note.copy(folderId = folderId, updatedAt = Clock.System.now())
notesRepo.updateNote(updated)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.NoteFolder
import com.itlab.domain.repository.NoteFolderRepository
import kotlinx.coroutines.flow.Flow

class ObserveFoldersUseCase(private val repo: NoteFolderRepository) {
operator fun invoke(): Flow<List<NoteFolder>> = repo.observeFolders()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class ObserveNotesByFolderUseCase(private val repo: NotesRepository) {
operator fun invoke(folderId: String?): Flow<List<Note>> =
repo.observeNotes().map { notes ->
if (folderId == null) notes else notes.filter { it.folderId == folderId }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository
import kotlinx.coroutines.flow.Flow

class ObserveNotesUseCase(private val repo: NotesRepository) {
operator fun invoke(): Flow<List<Note>> = repo.observeNotes()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.NoteFolder
import com.itlab.domain.repository.NoteFolderRepository
import kotlinx.datetime.Clock

class UpdateFolderUseCase(private val repo: NoteFolderRepository) {
suspend operator fun invoke(folder: NoteFolder) {
val folder = folder.copy(updatedAt = Clock.System.now())
repo.updateFolder(folder)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.itlab.domain.usecase

import com.itlab.domain.model.Note
import com.itlab.domain.repository.NotesRepository
import kotlinx.datetime.Clock

class UpdateNoteUseCase(private val repo: NotesRepository) {
suspend operator fun invoke(note: Note) {
val note = note.copy(updatedAt = Clock.System.now())
repo.updateNote(note)
}
}
26 changes: 0 additions & 26 deletions domain/src/test/java/com/itlab/domain/ExampleUnitTest.kt

This file was deleted.

Loading
Loading