Skip to content

Commit 6864ff8

Browse files
committed
Refactor the columnType field in TableColumn to use an ADT (ColumnType).
1 parent 9e1864a commit 6864ff8

File tree

6 files changed

+54
-9
lines changed

6 files changed

+54
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package net.wiringbits.spra.admin.models
2+
3+
sealed trait ColumnType {
4+
val value: String
5+
}
6+
7+
object ColumnType {
8+
case class Date(value: String) extends ColumnType
9+
case class Text(value: String) extends ColumnType
10+
case class Bytea(value: String) extends ColumnType
11+
case class Int(value: String) extends ColumnType
12+
case class Decimal(value: String) extends ColumnType
13+
case class UUID(value: String) extends ColumnType
14+
15+
def parseColumnType(columnType: String): ColumnType = {
16+
// 'contains' is used because PostgreSQL types may include additional details like precision or scale
17+
// https://www.postgresql.org/docs/8.1/datatype.html
18+
val isInt = List("int", "serial").exists(columnType.contains)
19+
val isDecimal = List("float", "decimal").exists(columnType.contains)
20+
val isBytea = columnType == "bytea"
21+
val isUUID = columnType == "uuid"
22+
val isDate = List("date", "time").exists(columnType.contains)
23+
24+
if (isDate)
25+
Date(columnType)
26+
else if (isDecimal)
27+
Decimal(columnType)
28+
else if (isBytea)
29+
Bytea(columnType)
30+
else if (isInt)
31+
Int(columnType)
32+
else if (isUUID)
33+
UUID(columnType)
34+
else
35+
Text(columnType)
36+
}
37+
}

spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.wiringbits.spra.admin.repositories.daos
22

33
import anorm.{SqlParser, SqlStringInterpolation}
44
import net.wiringbits.spra.admin.config.{CustomDataType, PrimaryKeyDataType, TableSettings}
5+
import net.wiringbits.spra.admin.models.ColumnType
56
import net.wiringbits.spra.admin.repositories.models.*
67
import net.wiringbits.spra.admin.utils.models.{FilterParameter, QueryParameters}
78
import net.wiringbits.spra.admin.utils.{QueryBuilder, StringRegex}
@@ -38,7 +39,7 @@ object DatabaseTablesDAO {
3839
val fields = for {
3940
columnNumber <- 1 to numberOfColumns
4041
columnName = metadata.getColumnName(columnNumber)
41-
columnType = metadata.getColumnTypeName(columnNumber)
42+
columnType = ColumnType.parseColumnType(metadata.getColumnTypeName(columnNumber))
4243
} yield TableColumn(columnName, columnType)
4344
fields.toList
4445
} finally {

spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.wiringbits.spra.admin.repositories
22

33
import anorm.*
4+
import anorm.SqlParser.get
5+
import net.wiringbits.spra.admin.models.ColumnType
46
import net.wiringbits.spra.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn}
57

68
package object daos {
@@ -28,10 +30,13 @@ package object daos {
2830
}
2931

3032
val tableColumnParser: RowParser[TableColumn] = {
31-
Macro.parser[TableColumn](
32-
"column_name",
33-
"data_type"
34-
)
33+
get[String]("column_name") ~
34+
get[String]("data_type") map { case name ~ columnTypeStr =>
35+
TableColumn(
36+
name = name,
37+
`type` = ColumnType.parseColumnType(columnTypeStr)
38+
)
39+
}
3540
}
3641

3742
val foreignKeyParser: RowParser[ForeignKey] = {
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.wiringbits.spra.admin.repositories.models
22

3+
import net.wiringbits.spra.admin.models.ColumnType
4+
35
case class TableColumn(
46
name: String,
5-
`type`: String
7+
`type`: ColumnType
68
)

spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class AdminService @Inject() (
6666
None
6767
AdminGetTables.Response.TableColumn(
6868
name = fieldName,
69-
`type` = column.`type`,
69+
`type` = column.`type`.value,
7070
editable = isEditable,
7171
reference = reference,
7272
filterable = isFilterable,

spra-play-server/src/main/scala/net/wiringbits/spra/admin/utils/QueryBuilder.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ object QueryBuilder {
2020
}
2121
for ((tableColumn, _) <- fieldsAndValues) {
2222
sqlFields.append(s", ${tableColumn.name}")
23-
sqlValues.append(s", ?::${tableColumn.`type`}")
23+
sqlValues.append(s", ?::${tableColumn.`type`.value}")
2424
}
2525

2626
s"""
@@ -36,7 +36,7 @@ object QueryBuilder {
3636
def update(tableName: String, body: Map[TableColumn, String], primaryKeyField: String): String = {
3737
val updateStatement = new mutable.StringBuilder("SET")
3838
for ((tableField, value) <- body) {
39-
val resultStatement = if (value == "null") "NULL" else s"?::${tableField.`type`}"
39+
val resultStatement = if (value == "null") "NULL" else s"?::${tableField.`type`.value}"
4040
val statement = s" ${tableField.name} = $resultStatement,"
4141
updateStatement.append(statement)
4242
}

0 commit comments

Comments
 (0)