Skip to content

Commit 0095eb6

Browse files
authored
Merge pull request #2931 from OpenNeuroOrg/server/typescript-fixes
Migrate server code to TypeScript
2 parents 70f7db8 + 359570e commit 0095eb6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+178
-431
lines changed

packages/openneuro-server/src/app.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import Keyv from 'keyv'
2121
import KeyvRedis from '@keyv/redis'
2222
import cookieParser from 'cookie-parser'
2323
import * as jwt from './libs/authentication/jwt'
24-
import * as auth from './libs/authentication/states.js'
25-
import { sitemapHandler } from './handlers/sitemap.js'
26-
import { setupPassportAuth } from './libs/authentication/passport.js'
24+
import * as auth from './libs/authentication/states'
25+
import { sitemapHandler } from './handlers/sitemap'
26+
import { setupPassportAuth } from './libs/authentication/passport'
2727
import { redis } from './libs/redis'
2828
import { version } from './lerna.json'
2929
export { Express } from 'express-serve-static-core'

packages/openneuro-server/src/datalad/__tests__/changelog.spec.js renamed to packages/openneuro-server/src/datalad/__tests__/changelog.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import * as changelog from '../changelog.js'
1+
import { vi } from 'vitest'
2+
import * as changelog from '../changelog'
23

34
vi.mock('ioredis')
4-
vi.mock('../../config.js')
5+
vi.mock('../../config.ts')
56

67
describe('changelog editing tools', () => {
78
describe('findVersion()', () => {

packages/openneuro-server/src/datalad/__tests__/dataset.spec.js renamed to packages/openneuro-server/src/datalad/__tests__/dataset.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { vi } from 'vitest'
22
import request from 'superagent'
3-
import { createDataset, datasetsFilter, testBlacklist } from '../dataset.js'
3+
import { createDataset, datasetsFilter, testBlacklist } from '../dataset'
44
import { getDatasetWorker } from '../../libs/datalad-service'
55
import { connect } from 'mongoose'
66

77
// Mock requests to Datalad service
88
vi.mock('superagent')
99
vi.mock('ioredis')
10-
vi.mock('../../libs/redis.js')
11-
vi.mock('../../config.js')
12-
vi.mock('../../libs/notifications.js')
10+
vi.mock('../../libs/redis')
11+
vi.mock('../../config.ts')
12+
vi.mock('../../libs/notifications')
1313

1414
describe('dataset model operations', () => {
1515
describe('createDataset()', () => {

packages/openneuro-server/src/datalad/__tests__/description.spec.js renamed to packages/openneuro-server/src/datalad/__tests__/description.spec.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import { vi } from 'vitest'
12
import {
23
getDescriptionObject,
34
repairDescriptionTypes,
45
appendSeniorAuthor,
5-
} from '../description.js'
6+
} from '../description'
67

78
// Mock requests to Datalad service
89
vi.mock('ioredis')
9-
vi.mock('../../config.js')
10+
vi.mock('../../config.ts')
1011

1112
describe('datalad dataset descriptions', () => {
1213
describe('appendSeniorAuthor', () => {
@@ -92,6 +93,7 @@ describe('datalad dataset descriptions', () => {
9293
global.fetch = vi.fn()
9394
})
9495
it('returns the parsed dataset_description.json object', async () => {
96+
// @ts-expect-error Fetch mock includes mockResolvedValue
9597
fetch.mockResolvedValue({
9698
json: () =>
9799
Promise.resolve({ Name: 'Balloon Analog Risk-taking Task' }),
@@ -105,6 +107,7 @@ describe('datalad dataset descriptions', () => {
105107
})
106108
it('handles a corrupted response', async () => {
107109
global.fetch = vi.fn()
110+
// @ts-expect-error Fetch mock includes mockResolvedValue
108111
fetch.mockResolvedValue({
109112
json: () => Promise.reject('JSON could not be parsed'),
110113
headers: {
@@ -120,6 +123,7 @@ describe('datalad dataset descriptions', () => {
120123
})
121124
it('throws an error when nothing is returned', async () => {
122125
global.fetch = vi.fn()
126+
// @ts-expect-error Fetch mock includes mockResolvedValue
123127
fetch.mockResolvedValue({
124128
json: () => Promise.reject('JSON could not be parsed'),
125129
headers: {

packages/openneuro-server/src/datalad/__tests__/files.spec.js renamed to packages/openneuro-server/src/datalad/__tests__/files.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi } from 'vitest'
12
import {
23
encodeFilePath,
34
decodeFilePath,
@@ -6,7 +7,7 @@ import {
67
} from '../files'
78

89
vi.mock('ioredis')
9-
vi.mock('../../config.js')
10+
vi.mock('../../config.ts')
1011

1112
const filename = 'sub-01/anat/sub-01_T1w.nii.gz'
1213

@@ -69,6 +70,7 @@ describe('datalad files', () => {
6970
size: 1945682,
7071
},
7172
]
73+
// @ts-expect-error Test is mocking this
7274
expect(computeTotalSize(mockFileSizes)).toBe(1957206)
7375
})
7476
})

packages/openneuro-server/src/datalad/__tests__/snapshots.spec.js renamed to packages/openneuro-server/src/datalad/__tests__/snapshots.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { vi } from 'vitest'
22
vi.mock('ioredis')
33
import request from 'superagent'
4-
import { createDataset } from '../dataset.js'
5-
import { createSnapshot } from '../snapshots.js'
4+
import { createDataset } from '../dataset'
5+
import { createSnapshot } from '../snapshots'
66
import { getDatasetWorker } from '../../libs/datalad-service'
77
import { connect } from 'mongoose'
88

@@ -17,11 +17,11 @@ vi.mock('../../libs/redis.js', () => ({
1717
},
1818
}))
1919
// Mock draft files calls
20-
vi.mock('../draft.js', () => ({
20+
vi.mock('../draft.ts', () => ({
2121
updateDatasetRevision: () => () => Promise.resolve(),
2222
}))
23-
vi.mock('../../config.js')
24-
vi.mock('../../libs/notifications.js')
23+
vi.mock('../../config.ts')
24+
vi.mock('../../libs/notifications.ts')
2525

2626
describe('snapshot model operations', () => {
2727
describe('createSnapshot()', () => {

packages/openneuro-server/src/datalad/changelog.js renamed to packages/openneuro-server/src/datalad/changelog.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import format from 'date-fns/format'
2-
import { addFileString, commitFiles } from './dataset.js'
2+
import { addFileString, commitFiles } from './dataset'
33
import { getDatasetWorker } from '../libs/datalad-service'
44

55
/**

packages/openneuro-server/src/datalad/dataset.js renamed to packages/openneuro-server/src/datalad/dataset.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import request from 'superagent'
77
import requestNode from 'request'
88
import objectHash from 'object-hash'
99
import { Readable } from 'stream'
10+
import * as Mongoose from 'mongoose'
1011
import config from '../config'
11-
import * as subscriptions from '../handlers/subscriptions.js'
12+
import * as subscriptions from '../handlers/subscriptions'
1213
import { generateDataladCookie } from '../libs/authentication/jwt'
1314
import { redis } from '../libs/redis'
1415
import CacheItem, { CacheType } from '../cache/item'
15-
import { updateDatasetRevision } from './draft.js'
16+
import { updateDatasetRevision } from './draft'
1617
import { fileUrl, getFileName, encodeFilePath, filesUrl } from './files'
17-
import { getAccessionNumber } from '../libs/dataset.js'
18+
import { getAccessionNumber } from '../libs/dataset'
1819
import Dataset from '../models/dataset'
1920
import Metadata from '../models/metadata'
2021
import Permission from '../models/permission'
@@ -119,7 +120,7 @@ export const cacheDatasetConnection = options => connectionArguments => {
119120
* @param {object} match MongoDB $match aggregate
120121
* @returns {Array<object>} Array of MongoDB aggregate pipelines
121122
*/
122-
const aggregateArraySetup = match => [{ $match: match }]
123+
const aggregateArraySetup = (match): Mongoose.Expression => [{ $match: match }]
123124

124125
/**
125126
* Add any filter steps based on the filterBy options provided
@@ -157,7 +158,7 @@ export const datasetsFilter = options => match => {
157158
)
158159
return aggregates
159160
}
160-
const filterMatch = {}
161+
const filterMatch: Mongoose.Expression = {}
161162
if ('filterBy' in options) {
162163
const filters = options.filterBy
163164
if (

packages/openneuro-server/src/datalad/description.js renamed to packages/openneuro-server/src/datalad/description.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
*/
44
import config from '../config'
55
import request from 'superagent'
6-
import { redis } from '../libs/redis.js'
7-
import { commitFiles } from './dataset.js'
6+
import { redis } from '../libs/redis'
7+
import { commitFiles } from './dataset'
88
import { fileUrl } from './files'
99
import { generateDataladCookie } from '../libs/authentication/jwt'
1010
import { getDatasetWorker } from '../libs/datalad-service'

packages/openneuro-server/src/datalad/draft.js renamed to packages/openneuro-server/src/datalad/draft.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
*/
44
import request from 'superagent'
55
import Dataset from '../models/dataset'
6-
import publishDraftUpdate from '../graphql/utils/publish-draft-update.js'
76
import { getDatasetWorker } from '../libs/datalad-service'
87

98
export const getDraftRevision = async datasetId => {
@@ -19,9 +18,7 @@ export const updateDatasetRevision = (datasetId, gitRef) => {
1918
/**
2019
* Update the revision modified time in a draft on changes
2120
*/
22-
return Dataset.updateOne({ id: datasetId }, { modified: new Date() })
23-
.exec()
24-
.then(() => publishDraftUpdate(datasetId, gitRef))
21+
return Dataset.updateOne({ id: datasetId }, { modified: new Date() }).exec()
2522
}
2623

2724
/**

packages/openneuro-server/src/datalad/snapshots.js renamed to packages/openneuro-server/src/datalad/snapshots.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ import request from 'superagent'
55
import { reindexDataset } from '../elasticsearch/reindex-dataset'
66
import { redis, redlock } from '../libs/redis'
77
import CacheItem, { CacheType } from '../cache/item'
8-
import config from '../config.js'
8+
import config from '../config'
99
import {
1010
updateDatasetName,
1111
snapshotCreationComparison,
12-
} from '../graphql/resolvers/dataset.js'
13-
import { description } from '../graphql/resolvers/description.js'
14-
import doiLib from '../libs/doi/index.js'
12+
} from '../graphql/resolvers/dataset'
13+
import { description } from '../graphql/resolvers/description'
14+
import doiLib from '../libs/doi/index'
1515
import { getFiles } from './files'
1616
import { generateDataladCookie } from '../libs/authentication/jwt'
1717
import notifications from '../libs/notifications'
1818
import Dataset from '../models/dataset'
19-
import Snapshot from '../models/snapshot'
20-
import { updateDatasetRevision } from './draft.js'
19+
import Snapshot, { SnapshotDocument } from '../models/snapshot'
20+
import { updateDatasetRevision } from './draft'
2121
import { getDatasetWorker } from '../libs/datalad-service'
2222
import { join } from 'path'
2323

@@ -94,7 +94,7 @@ const postSnapshot = async (
9494
* @param {string} datasetId Dataset accession number
9595
* @returns {Promise<import('../models/snapshot').SnapshotDocument[]>}
9696
*/
97-
export const getSnapshots = datasetId => {
97+
export const getSnapshots = (datasetId): Promise<SnapshotDocument[]> => {
9898
const url = `${getDatasetWorker(datasetId)}/datasets/${datasetId}/snapshots`
9999
return request
100100
.get(url)
@@ -194,7 +194,10 @@ export const deleteSnapshot = (datasetId, tag) => {
194194
* @param {string} commitRef Tag name to retrieve
195195
* @returns {Promise<import('../models/snapshot').SnapshotDocument>}
196196
*/
197-
export const getSnapshot = (datasetId, commitRef) => {
197+
export const getSnapshot = (
198+
datasetId,
199+
commitRef,
200+
): Promise<SnapshotDocument> => {
198201
const url = `${getDatasetWorker(
199202
datasetId,
200203
)}/datasets/${datasetId}/snapshots/${commitRef}`

packages/openneuro-server/src/elasticsearch/elastic-client.js renamed to packages/openneuro-server/src/elasticsearch/elastic-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import config from '../config.js'
1+
import config from '../config'
22
import { Client } from '@elastic/elasticsearch'
33

44
const elasticConfig = {

packages/openneuro-server/src/elasticsearch/reindex-dataset.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import config from '../config.js'
1+
import config from '../config'
22
import { indexDataset, queryForIndex, indexingToken } from '@openneuro/search'
33
import { elasticClient } from './elastic-client'
44
import {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`resolver permissions helpers > checkDatasetAdmin() > resolves to false for anonymous users 1`] = `"You do not have admin access to this dataset."`;
4+
5+
exports[`resolver permissions helpers > checkDatasetWrite() > resolves to false for anonymous users 1`] = `"You do not have access to modify this dataset."`;

packages/openneuro-server/src/graphql/__tests__/permissions.spec.js renamed to packages/openneuro-server/src/graphql/__tests__/permissions.spec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi } from 'vitest'
12
import {
23
datasetReadQuery,
34
checkPermissionLevel,
@@ -95,12 +96,17 @@ describe('resolver permissions helpers', () => {
9596
describe('checkDatasetAdmin()', () => {
9697
it('resolves to false for anonymous users', () => {
9798
return expect(
98-
checkDatasetAdmin('ds000001', null, null, false),
99+
checkDatasetAdmin('ds000001', null, null, { checkExists: false }),
99100
).rejects.toThrowErrorMatchingSnapshot()
100101
})
101102
it('resolves to true for admins', () => {
102103
return expect(
103-
checkDatasetAdmin('ds000001', '1234', { admin: true }, false),
104+
checkDatasetAdmin(
105+
'ds000001',
106+
'1234',
107+
{ admin: true },
108+
{ checkExists: false },
109+
),
104110
).resolves.toBe(true)
105111
})
106112
})

packages/openneuro-server/src/graphql/permissions.js renamed to packages/openneuro-server/src/graphql/permissions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import config from '../config.js'
1+
import config from '../config'
22
import { GraphQLError } from 'graphql'
33
import Permission from '../models/permission'
44
import Dataset from '../models/dataset'

packages/openneuro-server/src/graphql/pubsub.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

packages/openneuro-server/src/graphql/resolvers/__tests__/dataset-search.spec.js renamed to packages/openneuro-server/src/graphql/resolvers/__tests__/dataset-search.spec.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import { vi } from 'vitest'
12
import {
23
encodeCursor,
34
decodeCursor,
45
elasticRelayConnection,
56
} from '../dataset-search'
67

78
vi.mock('ioredis')
8-
vi.mock('../../../elasticsearch/elastic-client.js')
9-
vi.mock('../../../config.js')
9+
vi.mock('../../../elasticsearch/elastic-client.ts')
10+
vi.mock('../../../config.ts')
1011

1112
describe('dataset search resolvers', () => {
1213
describe('encodeCursor()', () => {
@@ -46,6 +47,7 @@ describe('dataset search resolvers', () => {
4647
hasPreviousPage: false,
4748
},
4849
}
50+
// @ts-expect-error Mock version does not use all arguments
4951
const connection = await elasticRelayConnection(emptyApiResponse, {
5052
dataset: vi.fn(),
5153
})

packages/openneuro-server/src/graphql/resolvers/__tests__/dataset.spec.js renamed to packages/openneuro-server/src/graphql/resolvers/__tests__/dataset.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as ds from '../dataset'
55

66
vi.mock('superagent')
77
vi.mock('ioredis')
8-
vi.mock('../../../config.js')
9-
vi.mock('../../../libs/notifications.js')
8+
vi.mock('../../../config.ts')
9+
vi.mock('../../../libs/notifications.ts')
1010

1111
describe('dataset resolvers', () => {
1212
beforeAll(() => {
@@ -40,9 +40,9 @@ describe('dataset resolvers', () => {
4040
})
4141
it('sorts array of objects by the "created" property as strings', () => {
4242
const testArray = [
43-
{ id: 2, created: '2018-11-20T00:05:43.473Z' },
44-
{ id: 1, created: '2018-11-19T00:05:43.473Z' },
45-
{ id: 3, created: '2018-11-23T00:05:43.473Z' },
43+
{ id: 2, created: '2018-11-20T00:05:43.473Z', tag: '2.0.0' },
44+
{ id: 1, created: '2018-11-19T00:05:43.473Z', tag: '1.0.0' },
45+
{ id: 3, created: '2018-11-23T00:05:43.473Z', tag: '3.0.0' },
4646
]
4747
const sorted = testArray.sort(ds.snapshotCreationComparison)
4848
expect(sorted[0].id).toBe(1)

packages/openneuro-server/src/graphql/resolvers/__tests__/permssions.spec.js renamed to packages/openneuro-server/src/graphql/resolvers/__tests__/permssions.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi } from 'vitest'
12
import { updatePermissions } from '../permissions'
23

34
vi.mock('ioredis')
@@ -22,7 +23,7 @@ describe('permissions resolvers', () => {
2223
await updatePermissions(
2324
{},
2425
{ datasetId: 'ds01234', userEmail: 'fake@test.com' },
25-
{},
26+
{ user: '1234', userInfo: { id: '1234' } },
2627
)
2728
} catch (err) {
2829
error = err

packages/openneuro-server/src/graphql/resolvers/__tests__/snapshots.spec.js renamed to packages/openneuro-server/src/graphql/resolvers/__tests__/snapshots.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { matchKnownObjects, filterLatestSnapshot } from '../snapshots.js'
1+
import { vi } from 'vitest'
2+
import { matchKnownObjects, filterLatestSnapshot } from '../snapshots'
23

34
vi.mock('ioredis')
4-
vi.mock('../../../config.js')
5+
vi.mock('../../../config.ts')
56

67
describe('snapshot resolvers', () => {
78
describe('matchKnownObjects()', () => {

packages/openneuro-server/src/graphql/resolvers/__tests__/user.spec.js renamed to packages/openneuro-server/src/graphql/resolvers/__tests__/user.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi } from 'vitest'
12
import { users } from '../user.js'
23

34
vi.mock('ioredis')

packages/openneuro-server/src/graphql/resolvers/comment.js renamed to packages/openneuro-server/src/graphql/resolvers/comment.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Comment from '../../models/comment'
2-
import notifications from '../../libs/notifications.js'
2+
import notifications from '../../libs/notifications'
33
import { user } from './user.js'
44
import { checkAdmin } from '../permissions'
55

0 commit comments

Comments
 (0)