mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Introduce table to store client settings per collective
This commit is contained in:
@ -0,0 +1,12 @@
|
||||
ALTER TABLE "client_settings" RENAME TO "client_settings_user";
|
||||
|
||||
CREATE TABLE "client_settings_collective" (
|
||||
"id" varchar(254) not null primary key,
|
||||
"client_id" varchar(254) not null,
|
||||
"cid" varchar(254) not null,
|
||||
"settings_data" text not null,
|
||||
"created" timestamp not null,
|
||||
"updated" timestamp not null,
|
||||
foreign key ("cid") references "collective"("cid") on delete cascade,
|
||||
unique ("client_id", "cid")
|
||||
);
|
@ -0,0 +1,12 @@
|
||||
RENAME TABLE `client_settings` TO `client_settings_user`;
|
||||
|
||||
CREATE TABLE `client_settings` (
|
||||
`id` varchar(254) not null primary key,
|
||||
`cid` varchar(254) not null,
|
||||
`user_id` varchar(254) not null,
|
||||
`settings_data` longtext not null,
|
||||
`created` timestamp not null,
|
||||
`updated` timestamp not null,
|
||||
foreign key (`cid`) references `collective`(`cid`) on delete cascade,
|
||||
unique (`client_id`, `cid`)
|
||||
);
|
@ -0,0 +1,12 @@
|
||||
ALTER TABLE "client_settings" RENAME TO "client_settings_user";
|
||||
|
||||
CREATE TABLE "client_settings_collective" (
|
||||
"id" varchar(254) not null primary key,
|
||||
"client_id" varchar(254) not null,
|
||||
"cid" varchar(254) not null,
|
||||
"settings_data" text not null,
|
||||
"created" timestamp not null,
|
||||
"updated" timestamp not null,
|
||||
foreign key ("cid") references "collective"("cid") on delete cascade,
|
||||
unique ("client_id", "cid")
|
||||
);
|
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2020 Eike K. & Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package docspell.store.records
|
||||
|
||||
import cats.data.NonEmptyList
|
||||
import cats.implicits._
|
||||
|
||||
import docspell.common._
|
||||
import docspell.store.qb.DSL._
|
||||
import docspell.store.qb._
|
||||
|
||||
import doobie._
|
||||
import doobie.implicits._
|
||||
import io.circe.Json
|
||||
|
||||
case class RClientSettingsCollective(
|
||||
id: Ident,
|
||||
clientId: Ident,
|
||||
cid: Ident,
|
||||
settingsData: Json,
|
||||
updated: Timestamp,
|
||||
created: Timestamp
|
||||
) {}
|
||||
|
||||
object RClientSettingsCollective {
|
||||
|
||||
final case class Table(alias: Option[String]) extends TableDef {
|
||||
val tableName = "client_settings_collective"
|
||||
|
||||
val id = Column[Ident]("id", this)
|
||||
val clientId = Column[Ident]("client_id", this)
|
||||
val cid = Column[Ident]("cid", this)
|
||||
val settingsData = Column[Json]("settings_data", this)
|
||||
val updated = Column[Timestamp]("updated", this)
|
||||
val created = Column[Timestamp]("created", this)
|
||||
val all =
|
||||
NonEmptyList.of[Column[_]](id, clientId, cid, settingsData, updated, created)
|
||||
}
|
||||
|
||||
def as(alias: String): Table = Table(Some(alias))
|
||||
val T = Table(None)
|
||||
|
||||
def insert(v: RClientSettingsCollective): ConnectionIO[Int] = {
|
||||
val t = Table(None)
|
||||
DML.insert(
|
||||
t,
|
||||
t.all,
|
||||
fr"${v.id},${v.clientId},${v.cid},${v.settingsData},${v.updated},${v.created}"
|
||||
)
|
||||
}
|
||||
|
||||
def updateSettings(
|
||||
clientId: Ident,
|
||||
cid: Ident,
|
||||
data: Json,
|
||||
updateTs: Timestamp
|
||||
): ConnectionIO[Int] =
|
||||
DML.update(
|
||||
T,
|
||||
T.clientId === clientId && T.cid === cid,
|
||||
DML.set(T.settingsData.setTo(data), T.updated.setTo(updateTs))
|
||||
)
|
||||
|
||||
def upsert(clientId: Ident, cid: Ident, data: Json): ConnectionIO[Int] =
|
||||
for {
|
||||
id <- Ident.randomId[ConnectionIO]
|
||||
now <- Timestamp.current[ConnectionIO]
|
||||
nup <- updateSettings(clientId, cid, data, now)
|
||||
nin <-
|
||||
if (nup <= 0) insert(RClientSettingsCollective(id, clientId, cid, data, now, now))
|
||||
else 0.pure[ConnectionIO]
|
||||
} yield nup + nin
|
||||
|
||||
def delete(clientId: Ident, cid: Ident): ConnectionIO[Int] =
|
||||
DML.delete(T, T.clientId === clientId && T.cid === cid)
|
||||
|
||||
def find(clientId: Ident, cid: Ident): ConnectionIO[Option[RClientSettingsCollective]] =
|
||||
run(select(T.all), from(T), T.clientId === clientId && T.cid === cid)
|
||||
.query[RClientSettingsCollective]
|
||||
.option
|
||||
}
|
@ -17,7 +17,7 @@ import doobie._
|
||||
import doobie.implicits._
|
||||
import io.circe.Json
|
||||
|
||||
case class RClientSettings(
|
||||
case class RClientSettingsUser(
|
||||
id: Ident,
|
||||
clientId: Ident,
|
||||
userId: Ident,
|
||||
@ -26,10 +26,10 @@ case class RClientSettings(
|
||||
created: Timestamp
|
||||
) {}
|
||||
|
||||
object RClientSettings {
|
||||
object RClientSettingsUser {
|
||||
|
||||
final case class Table(alias: Option[String]) extends TableDef {
|
||||
val tableName = "client_settings"
|
||||
val tableName = "client_settings_user"
|
||||
|
||||
val id = Column[Ident]("id", this)
|
||||
val clientId = Column[Ident]("client_id", this)
|
||||
@ -44,7 +44,7 @@ object RClientSettings {
|
||||
def as(alias: String): Table = Table(Some(alias))
|
||||
val T = Table(None)
|
||||
|
||||
def insert(v: RClientSettings): ConnectionIO[Int] = {
|
||||
def insert(v: RClientSettingsUser): ConnectionIO[Int] = {
|
||||
val t = Table(None)
|
||||
DML.insert(
|
||||
t,
|
||||
@ -71,15 +71,15 @@ object RClientSettings {
|
||||
now <- Timestamp.current[ConnectionIO]
|
||||
nup <- updateSettings(clientId, userId, data, now)
|
||||
nin <-
|
||||
if (nup <= 0) insert(RClientSettings(id, clientId, userId, data, now, now))
|
||||
if (nup <= 0) insert(RClientSettingsUser(id, clientId, userId, data, now, now))
|
||||
else 0.pure[ConnectionIO]
|
||||
} yield nup + nin
|
||||
|
||||
def delete(clientId: Ident, userId: Ident): ConnectionIO[Int] =
|
||||
DML.delete(T, T.clientId === clientId && T.userId === userId)
|
||||
|
||||
def find(clientId: Ident, userId: Ident): ConnectionIO[Option[RClientSettings]] =
|
||||
def find(clientId: Ident, userId: Ident): ConnectionIO[Option[RClientSettingsUser]] =
|
||||
run(select(T.all), from(T), T.clientId === clientId && T.userId === userId)
|
||||
.query[RClientSettings]
|
||||
.query[RClientSettingsUser]
|
||||
.option
|
||||
}
|
Reference in New Issue
Block a user