diff --git a/packages/openneuro-server/src/datalad/dataset.ts b/packages/openneuro-server/src/datalad/dataset.ts index 8d9f10e860..44cf0b135b 100644 --- a/packages/openneuro-server/src/datalad/dataset.ts +++ b/packages/openneuro-server/src/datalad/dataset.ts @@ -69,15 +69,26 @@ export const createDataset = async ( } } +interface WorkerDraftFields { + // Commit id hash + ref: string + // Commit tree ref + tree: string + // Commit message + message: string + // Commit author time + modified: string +} + /** * Return the latest commit * @param {string} id Dataset accession number */ -export const getDraftHead = async (id) => { +export const getDraftHead = async (id): Promise => { const draftRes = await request .get(`${getDatasetWorker(id)}/datasets/${id}/draft`) .set("Accept", "application/json") - return draftRes.body.hexsha + return draftRes.body } /** @@ -87,7 +98,7 @@ export const getDataset = async (id) => { const dataset = await Dataset.findOne({ id }).lean() return { ...dataset, - revision: await getDraftHead(id), + revision: (await getDraftHead(id)).ref, } } diff --git a/packages/openneuro-server/src/graphql/resolvers/dataset.ts b/packages/openneuro-server/src/graphql/resolvers/dataset.ts index bbe180ec01..d9dee85b00 100644 --- a/packages/openneuro-server/src/graphql/resolvers/dataset.ts +++ b/packages/openneuro-server/src/graphql/resolvers/dataset.ts @@ -276,11 +276,14 @@ const worker = (obj) => getDatasetWorker(obj.id) */ const Dataset = { uploader: (ds) => user(ds, { id: ds.uploader }), - draft: async (obj) => ({ - id: obj.id, - revision: await datalad.getDraftHead(obj.id), - modified: obj.modified, - }), + draft: async (obj) => { + const draftHead = await datalad.getDraftHead(obj.id) + return { + id: obj.id, + revision: draftHead.ref, + modified: draftHead.modified, + } + }, snapshots, latestSnapshot, analytics, diff --git a/packages/openneuro-server/src/graphql/resolvers/snapshots.ts b/packages/openneuro-server/src/graphql/resolvers/snapshots.ts index 2b9fb272e2..70ae9dd88d 100644 --- a/packages/openneuro-server/src/graphql/resolvers/snapshots.ts +++ b/packages/openneuro-server/src/graphql/resolvers/snapshots.ts @@ -227,7 +227,7 @@ export const latestSnapshot = async (obj, _, context) => { // In the case where there are no real snapshots, return most recent commit as snapshot return await snapshot( obj, - { datasetId: obj.id, tag: await getDraftHead(obj.id) }, + { datasetId: obj.id, tag: (await getDraftHead(obj.id)).ref }, context, ) } diff --git a/services/datalad/datalad_service/handlers/draft.py b/services/datalad/datalad_service/handlers/draft.py index 4c1cb6e967..ae08bc8f6d 100644 --- a/services/datalad/datalad_service/handlers/draft.py +++ b/services/datalad/datalad_service/handlers/draft.py @@ -1,3 +1,4 @@ +import datetime import os import falcon @@ -19,8 +20,11 @@ async def on_get(self, req, resp, dataset): if dataset and os.path.exists(dataset_path): repo = pygit2.Repository(dataset_path) commit = repo.revparse_single('HEAD') - resp.media = {'hexsha': str(commit.id), - 'tree': str(commit.tree_id)} + resp.media = {'ref': str(commit.id), + 'hexsha': str(commit.id), # Deprecate 'hexsha' but retain for now + 'tree': str(commit.tree_id), + 'message': str(commit.message), + 'modified': datetime.datetime.fromtimestamp(commit.author.time).isoformat() + 'Z'} resp.status = falcon.HTTP_OK else: resp.status = falcon.HTTP_NOT_FOUND