feat: Add the ability to save search queries

I got tired of putting the same tag over and over, so...
This commit is contained in:
Ahmad Ansori Palembani 2025-04-14 21:02:12 +07:00
parent 7a08ca294a
commit f13f98f19a
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
26 changed files with 880 additions and 80 deletions

View file

@ -10,6 +10,7 @@ kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(projects.domain)
api(libs.bundles.db)
}
}

View file

@ -0,0 +1,37 @@
package yokai.data.source.browse.filter
import yokai.data.DatabaseHandler
import yokai.domain.source.browse.filter.SavedSearchRepository
import yokai.domain.source.browse.filter.models.RawSavedSearch
class SavedSearchRepositoryImpl(private val handler: DatabaseHandler) : SavedSearchRepository {
override suspend fun findAll(): List<RawSavedSearch> = handler.awaitList {
saved_searchQueries.findAll(RawSavedSearch::mapper)
}
override fun subscribeAllBySourceId(sourceId: Long) = handler.subscribeToList {
saved_searchQueries.findBySourceId(sourceId, RawSavedSearch::mapper)
}
override suspend fun findAllBySourceId(sourceId: Long) = handler.awaitList {
saved_searchQueries.findBySourceId(sourceId, RawSavedSearch::mapper)
}
override suspend fun findOneBySourceIdAndName(sourceId: Long, name: String): RawSavedSearch? = handler.awaitFirstOrNull {
saved_searchQueries.findBySourceIdAndName(sourceId, name, RawSavedSearch::mapper)
}
override suspend fun findById(id: Long): RawSavedSearch? = handler.awaitFirstOrNull {
saved_searchQueries.findById(id, RawSavedSearch::mapper)
}
override suspend fun deleteById(id: Long) = handler.await {
saved_searchQueries.deleteById(id)
}
override suspend fun insert(sourceId: Long, name: String, query: String?, filtersJson: String?) =
handler.awaitOneOrNullExecutable(inTransaction = true) {
saved_searchQueries.insert(sourceId, name, query, filtersJson)
saved_searchQueries.selectLastInsertedRowId()
}
}

View file

@ -0,0 +1,35 @@
CREATE TABLE saved_search(
-- TODO: Migrate the other tables to use 'id' instead of '_id'
id INTEGER NOT NULL PRIMARY KEY,
source_id INTEGER NOT NULL,
name TEXT NOT NULL,
query TEXT,
filters_json TEXT,
UNIQUE (source_id, name)
);
findAll:
SELECT * FROM saved_search
ORDER BY name COLLATE NOCASE ASC;
findBySourceId:
SELECT * FROM saved_search WHERE source_id = :sourceId
ORDER BY name COLLATE NOCASE ASC;
findBySourceIdAndName:
SELECT * FROM saved_search WHERE source_id = :sourceId AND name = :name
ORDER BY name COLLATE NOCASE ASC;
findById:
SELECT * FROM saved_search WHERE id = :id
ORDER BY name COLLATE NOCASE ASC;
deleteById:
DELETE FROM saved_search WHERE id = :id;
insert:
INSERT INTO saved_search(source_id, name, query, filters_json)
VALUES (:sourceId, :name, :query, :filtersJson);
selectLastInsertedRowId:
SELECT last_insert_rowid();

View file

@ -0,0 +1,8 @@
CREATE TABLE saved_search(
id INTEGER NOT NULL PRIMARY KEY,
source_id INTEGER NOT NULL,
name TEXT NOT NULL,
query TEXT,
filters_json TEXT,
UNIQUE (source_id, name)
);