Change custom field values for a single item

This commit is contained in:
Eike Kettner
2020-11-16 22:06:48 +01:00
parent 62313ab03a
commit 93295d63a5
9 changed files with 274 additions and 17 deletions

View File

@ -13,8 +13,7 @@ CREATE TABLE "custom_field_value" (
"id" varchar(254) not null primary key,
"item_id" varchar(254) not null,
"field" varchar(254) not null,
"value_text" varchar(300),
"value_numeric" numeric,
"field_value" varchar(300) not null,
foreign key ("item_id") references "item"("itemid"),
foreign key ("field") references "custom_field"("id"),
unique ("item_id", "field")

View File

@ -1,5 +1,7 @@
package docspell.store.records
import cats.implicits._
import docspell.common._
import docspell.store.impl.Column
import docspell.store.impl.Implicits._
@ -43,7 +45,7 @@ object RCustomField {
}
def exists(fname: Ident, coll: Ident): ConnectionIO[Boolean] =
???
selectCount(id, table, and(name.is(fname), cid.is(coll))).query[Int].unique.map(_ > 0)
def findById(fid: Ident, coll: Ident): ConnectionIO[Option[RCustomField]] =
selectSimple(all, table, and(id.is(fid), cid.is(coll))).query[RCustomField].option
@ -69,4 +71,19 @@ object RCustomField {
ftype.setTo(value.ftype)
)
).update.run
def setValue(f: RCustomField, item: Ident, fval: String): ConnectionIO[Int] =
for {
n <- RCustomFieldValue.updateValue(f.id, item, fval)
k <-
if (n == 0)
Ident
.randomId[ConnectionIO]
.flatMap(nId =>
RCustomFieldValue
.insert(RCustomFieldValue(nId, item, f.id, fval))
)
else 0.pure[ConnectionIO]
} yield n + k
}

View File

@ -11,8 +11,7 @@ case class RCustomFieldValue(
id: Ident,
itemId: Ident,
field: Ident,
valueText: Option[String],
valueNumeric: Option[BigDecimal]
value: String
)
object RCustomFieldValue {
@ -21,24 +20,34 @@ object RCustomFieldValue {
object Columns {
val id = Column("id")
val itemId = Column("item_id")
val field = Column("field")
val valueText = Column("value_text")
val valueNumeric = Column("value_numeric")
val id = Column("id")
val itemId = Column("item_id")
val field = Column("field")
val value = Column("field_value")
val all = List(id, itemId, field, valueText, valueNumeric)
val all = List(id, itemId, field, value)
}
def insert(value: RCustomFieldValue): ConnectionIO[Int] = {
val sql = insertRow(
table,
Columns.all,
fr"${value.id},${value.itemId},${value.field},${value.valueText},${value.valueNumeric}"
fr"${value.id},${value.itemId},${value.field},${value.value}"
)
sql.update.run
}
def updateValue(
fieldId: Ident,
item: Ident,
value: String
): ConnectionIO[Int] =
updateRow(
table,
and(Columns.itemId.is(item), Columns.field.is(fieldId)),
Columns.value.setTo(value)
).update.run
def countField(fieldId: Ident): ConnectionIO[Int] =
selectCount(Columns.id, table, Columns.field.is(fieldId)).query[Int].unique
@ -47,4 +56,7 @@ object RCustomFieldValue {
def deleteByItem(item: Ident): ConnectionIO[Int] =
deleteFrom(table, Columns.itemId.is(item)).update.run
def deleteValue(fieldId: Ident, item: Ident): ConnectionIO[Int] =
deleteFrom(table, and(Columns.id.is(fieldId), Columns.itemId.is(item))).update.run
}

View File

@ -323,6 +323,9 @@ object RItem {
def existsById(itemId: Ident): ConnectionIO[Boolean] =
selectCount(id, table, id.is(itemId)).query[Int].unique.map(_ > 0)
def existsByIdAndCollective(itemId: Ident, coll: Ident): ConnectionIO[Boolean] =
selectCount(id, table, and(id.is(itemId), cid.is(coll))).query[Int].unique.map(_ > 0)
def findByIdAndCollective(itemId: Ident, coll: Ident): ConnectionIO[Option[RItem]] =
selectSimple(all, table, and(id.is(itemId), cid.is(coll))).query[RItem].option