Skip to content

Commit

Permalink
Add admin endpoint exposing postgres details (#205)
Browse files Browse the repository at this point in the history
  • Loading branch information
dmgaldi authored Jan 31, 2024
1 parent 2fb905e commit 067f4f6
Show file tree
Hide file tree
Showing 19 changed files with 2,524 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ object CacheDB {
fun selectAdminAllDatasets(query: AdminAllDatasetsQuery) =
connection.use { it.selectAdminAllDatasets(query) }

fun selectAdminDatasetDetails(datasetID: DatasetID) =
connection.use { it.selectAdminDatasetDetails(datasetID) }

fun selectInstallFileCount(datasetID: DatasetID) =
connection.use { it.selectInstallFileCount(datasetID) }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.veupathdb.vdi.lib.db.cache.model

import org.veupathdb.vdi.lib.common.field.DatasetID
import org.veupathdb.vdi.lib.common.field.ProjectID
import org.veupathdb.vdi.lib.common.field.UserID
import org.veupathdb.vdi.lib.common.model.VDIDatasetVisibility
import org.veupathdb.vdi.lib.common.model.VDISyncControlRecord
import java.time.OffsetDateTime

data class AdminDatasetDetailsRecord(
val datasetID: DatasetID,
val ownerID: UserID,
val origin: String,
val created: OffsetDateTime,
val typeName: String,
val typeVersion: String,
val name: String,
val summary: String?,
val description: String?,
val sourceURL: String?,
val visibility: VDIDatasetVisibility,
val projectIDs: List<ProjectID>,
val syncControl: VDISyncControlRecord?,
val importStatus: DatasetImportStatus,
val importMessage: String?,
val messages: List<String>,
val installFiles: List<String>,
val uploadFiles: List<String>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package org.veupathdb.vdi.lib.db.cache.sql.select

import org.veupathdb.vdi.lib.common.field.DatasetID
import org.veupathdb.vdi.lib.common.model.VDIDatasetVisibility
import org.veupathdb.vdi.lib.common.model.VDISyncControlRecord
import org.veupathdb.vdi.lib.db.cache.model.AdminDatasetDetailsRecord
import org.veupathdb.vdi.lib.db.cache.model.DatasetImportStatus
import org.veupathdb.vdi.lib.db.cache.util.*
import java.sql.Connection
import java.time.OffsetDateTime

// language=postgresql
private const val SQL_BASE = """
SELECT
d.dataset_id
, d.owner_id
, d.origin
, d.created
, d.type_name
, d.type_version
, m.name
, m.summary
, m.description
, m.source_url
, m.visibility
, array(
SELECT p.project_id
FROM vdi.dataset_projects AS p
WHERE p.dataset_id = d.dataset_id
) AS projects
, array(SELECT m.message FROM vdi.import_messages AS m WHERE m.dataset_id = d.dataset_id) AS messages
, array(SELECT file_name FROM vdi.install_files AS if WHERE if.dataset_id = d.dataset_id) AS install_files
, array(SELECT file_name FROM vdi.upload_files AS if WHERE if.dataset_id = d.dataset_id) AS upload_files
, i.status
, s.message
, sc.shares_update_time
, sc.data_update_time
, sc.meta_update_time
FROM
vdi.datasets AS d
INNER JOIN vdi.dataset_metadata AS m
USING (dataset_id)
LEFT JOIN vdi.import_control AS i
USING (dataset_id)
LEFT JOIN vdi.import_messages AS s
USING (dataset_id)
LEFT JOIN vdi.sync_control AS sc
USING (dataset_id)
WHERE
d.is_deleted = FALSE
AND
d.dataset_id = ?
"""


/**
* Selects the total count of datasets that match the given filter for the
* "all datasets" admin endpoint.
*/
internal fun Connection.selectAdminDatasetDetails(datasetID: DatasetID): AdminDatasetDetailsRecord? {
val sql = SQL_BASE

return withPreparedStatement(sql) {
setString(1, datasetID.toString())
withResults {
if (!this.next()) {
return null
}
AdminDatasetDetailsRecord(
datasetID = getDatasetID("dataset_id"),
ownerID = getUserID("owner_id"),
origin = getString("origin"),
created = getObject("created", OffsetDateTime::class.java),
typeName = getString("type_name"),
typeVersion = getString("type_version"),
name = getString("name"),
summary = getString("summary"),
description = getString("description"),
sourceURL = getString("source_url"),
visibility = VDIDatasetVisibility.fromString(getString("visibility")),
projectIDs = getProjectIDList("projects"),
importStatus = getString("status")?.let(DatasetImportStatus::fromString) ?: DatasetImportStatus.Queued,
importMessage = getString("message"),
syncControl = VDISyncControlRecord(
datasetID = getDatasetID("dataset_id"),
sharesUpdated = getObject("shares_update_time", OffsetDateTime::class.java),
dataUpdated = getObject("data_update_time", OffsetDateTime::class.java),
metaUpdated = getObject("meta_update_time", OffsetDateTime::class.java)
),
messages = getStringList("messages"),
installFiles = getStringList("install_files"),
uploadFiles = getStringList("upload_files")
)
}
}
}
13 changes: 13 additions & 0 deletions modules/rest-service/api.raml
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,19 @@ uses:
message: Dataset store is unreachable
requestId: b296c3d9-4032-41b1-906e-c97ccfc447e3

/dataset-details:
get:
queryParameters:
datasetId:
type: string
required: true
responses:
200:
body:
application/json:
type: lib.InternalDatasetDetails


/list-all-datasets:
get:
queryParameters:
Expand Down
Loading

0 comments on commit 067f4f6

Please sign in to comment.