@openneuro/server 4.38.0 → 4.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openneuro/server",
3
- "version": "4.38.0",
3
+ "version": "4.38.1",
4
4
  "description": "Core service for the OpenNeuro platform.",
5
5
  "license": "MIT",
6
6
  "main": "src/server.js",
@@ -21,7 +21,7 @@
21
21
  "@elastic/elasticsearch": "8.13.1",
22
22
  "@graphql-tools/schema": "^10.0.0",
23
23
  "@keyv/redis": "^4.5.0",
24
- "@openneuro/search": "^4.38.0",
24
+ "@openneuro/search": "^4.38.1",
25
25
  "@sentry/node": "^8.25.0",
26
26
  "@sentry/profiling-node": "^8.25.0",
27
27
  "base64url": "^3.0.0",
@@ -88,5 +88,5 @@
88
88
  "publishConfig": {
89
89
  "access": "public"
90
90
  },
91
- "gitHead": "728e285830c3e4a237208a3fd6066a71d49aae6f"
91
+ "gitHead": "6d5949cde219e5019ec2043ca4e5ebdde6083fae"
92
92
  }
@@ -169,3 +169,12 @@ export const checkAdmin = (userId, userInfo) =>
169
169
  userId && userInfo.admin
170
170
  ? Promise.resolve(true)
171
171
  : Promise.reject(states.ADMIN.errorMessage)
172
+
173
+ /**
174
+ * Check if the user is a worker
175
+ * @param userInfo User context
176
+ */
177
+ export const checkWorker = (userInfo) => {
178
+ if (userInfo?.worker) return true
179
+ else throw new Error("You must be a worker to make this request.")
180
+ }
@@ -46,6 +46,7 @@ import {
46
46
  import { saveAdminNote } from "./datasetEvents"
47
47
  import { createGitEvent } from "./gitEvents"
48
48
  import { updateFileCheck } from "./fileCheck"
49
+ import { updateWorkerTask } from "./worker"
49
50
 
50
51
  const Mutation = {
51
52
  createDataset,
@@ -95,6 +96,7 @@ const Mutation = {
95
96
  saveAdminNote,
96
97
  createGitEvent,
97
98
  updateFileCheck,
99
+ updateWorkerTask,
98
100
  }
99
101
 
100
102
  export default Mutation
@@ -0,0 +1,23 @@
1
+ import WorkerTask from "../../models/worker-task"
2
+ import { checkWorker } from "../permissions"
3
+
4
+ /**
5
+ * Update a worker task record
6
+ *
7
+ * This can be called for new tasks, or to update existing tasks.
8
+ */
9
+ export const updateWorkerTask = async (obj, args, { userInfo }) => {
10
+ checkWorker(userInfo)
11
+ const { id, ...updateData } = args
12
+
13
+ // Don't allow null values to unset fields
14
+ const update = Object.fromEntries(
15
+ Object.entries(updateData).filter(([, value]) => value != null),
16
+ )
17
+
18
+ const task = await WorkerTask.findOneAndUpdate({ id }, { $set: update }, {
19
+ new: true,
20
+ upsert: true,
21
+ }).exec()
22
+ return task
23
+ }
@@ -213,6 +213,19 @@ export const typeDefs = `
213
213
  annexFsck: [AnnexFsckInput!]!
214
214
  remote: String
215
215
  ): FileCheck
216
+ # Update worker task queue status
217
+ updateWorkerTask(
218
+ id: ID!,
219
+ args: JSON,
220
+ kwargs: JSON,
221
+ taskName: String,
222
+ worker: String,
223
+ queuedAt: DateTime,
224
+ startedAt: DateTime,
225
+ finishedAt: DateTime,
226
+ error: String,
227
+ executionTime: Int,
228
+ ): WorkerTask
216
229
  }
217
230
 
218
231
  # Anonymous dataset reviewer
@@ -941,6 +954,18 @@ export const typeDefs = `
941
954
  input: [String]
942
955
  }
943
956
 
957
+ type WorkerTask {
958
+ id: ID!
959
+ args: JSON
960
+ kwargs: JSON
961
+ taskName: String
962
+ worker: String
963
+ queuedAt: DateTime
964
+ startedAt: DateTime
965
+ finishedAt: DateTime
966
+ error: String
967
+ executionTime: Int
968
+ }
944
969
  `
945
970
 
946
971
  schemaComposer.addTypeDefs(typeDefs)
@@ -0,0 +1,38 @@
1
+ import mongoose from "mongoose"
2
+ import type { Document } from "mongoose"
3
+ const { Schema, model } = mongoose
4
+
5
+ export interface WorkerTaskDocument extends Document {
6
+ id: string
7
+ args?: Record<string, unknown>
8
+ kwargs?: Record<string, unknown>
9
+ taskName?: string
10
+ worker?: string
11
+ queuedAt?: Date
12
+ startedAt?: Date
13
+ finishedAt?: Date
14
+ error?: string
15
+ executionTime?: number
16
+ }
17
+
18
+ const workerTaskSchema = new Schema({
19
+ id: { type: String, required: true, unique: true },
20
+ args: { type: Object },
21
+ kwargs: { type: Object },
22
+ taskName: { type: String },
23
+ worker: { type: String },
24
+ queuedAt: { type: Date },
25
+ startedAt: { type: Date },
26
+ finishedAt: { type: Date },
27
+ error: { type: String },
28
+ executionTime: { type: Number },
29
+ })
30
+
31
+ workerTaskSchema.index({ id: 1 })
32
+
33
+ const WorkerTaskModel = model<WorkerTaskDocument>(
34
+ "WorkerTask",
35
+ workerTaskSchema,
36
+ )
37
+
38
+ export default WorkerTaskModel