@apollo-annotation/shared 0.1.19 → 0.1.21

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.
Files changed (138) hide show
  1. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.d.ts +33 -0
  2. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js +86 -0
  3. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js.map +1 -0
  4. package/dist/Changes/AddAssemblyFromExternalChange.d.ts +34 -0
  5. package/dist/Changes/AddAssemblyFromExternalChange.js +100 -0
  6. package/dist/Changes/AddAssemblyFromExternalChange.js.map +1 -0
  7. package/dist/Changes/AddAssemblyFromFileChange.d.ts +43 -0
  8. package/dist/Changes/AddAssemblyFromFileChange.js +146 -0
  9. package/dist/Changes/AddAssemblyFromFileChange.js.map +1 -0
  10. package/dist/Changes/AddFeatureChange.d.ts +35 -0
  11. package/dist/Changes/AddFeatureChange.js +169 -0
  12. package/dist/Changes/AddFeatureChange.js.map +1 -0
  13. package/dist/Changes/AddFeaturesFromFileChange.d.ts +32 -0
  14. package/dist/Changes/AddFeaturesFromFileChange.js +76 -0
  15. package/dist/Changes/AddFeaturesFromFileChange.js.map +1 -0
  16. package/dist/Changes/AddRefSeqAliasesChange.d.ts +20 -0
  17. package/dist/Changes/AddRefSeqAliasesChange.js +61 -0
  18. package/dist/Changes/AddRefSeqAliasesChange.js.map +1 -0
  19. package/dist/Changes/DeleteAssemblyChange.d.ts +18 -0
  20. package/dist/Changes/DeleteAssemblyChange.js +72 -0
  21. package/dist/Changes/DeleteAssemblyChange.js.map +1 -0
  22. package/dist/Changes/DeleteFeatureChange.d.ts +42 -0
  23. package/dist/Changes/DeleteFeatureChange.js +143 -0
  24. package/dist/Changes/DeleteFeatureChange.js.map +1 -0
  25. package/dist/Changes/DeleteUserChange.d.ts +25 -0
  26. package/dist/Changes/DeleteUserChange.js +53 -0
  27. package/dist/Changes/DeleteUserChange.js.map +1 -0
  28. package/dist/Changes/FeatureAttributeChange.d.ts +31 -0
  29. package/dist/Changes/FeatureAttributeChange.js +112 -0
  30. package/dist/Changes/FeatureAttributeChange.js.map +1 -0
  31. package/dist/Changes/FromFileBaseChange.d.ts +9 -0
  32. package/dist/Changes/FromFileBaseChange.js +187 -0
  33. package/dist/Changes/FromFileBaseChange.js.map +1 -0
  34. package/dist/Changes/ImportJBrowseConfigChange.d.ts +43 -0
  35. package/dist/Changes/ImportJBrowseConfigChange.js +67 -0
  36. package/dist/Changes/ImportJBrowseConfigChange.js.map +1 -0
  37. package/dist/Changes/LocationEndChange.d.ts +32 -0
  38. package/dist/Changes/LocationEndChange.js +129 -0
  39. package/dist/Changes/LocationEndChange.js.map +1 -0
  40. package/dist/Changes/LocationStartChange.d.ts +32 -0
  41. package/dist/Changes/LocationStartChange.js +129 -0
  42. package/dist/Changes/LocationStartChange.js.map +1 -0
  43. package/dist/Changes/StrandChange.d.ts +31 -0
  44. package/dist/Changes/StrandChange.js +114 -0
  45. package/dist/Changes/StrandChange.js.map +1 -0
  46. package/dist/Changes/TypeChange.d.ts +31 -0
  47. package/dist/Changes/TypeChange.js +114 -0
  48. package/dist/Changes/TypeChange.js.map +1 -0
  49. package/dist/Changes/UserChange.d.ts +25 -0
  50. package/dist/Changes/UserChange.js +51 -0
  51. package/dist/Changes/UserChange.js.map +1 -0
  52. package/dist/Changes/index.d.ts +50 -0
  53. package/dist/Changes/index.js +55 -0
  54. package/dist/Changes/index.js.map +1 -0
  55. package/dist/Checks/CDSCheck.d.ts +8 -0
  56. package/dist/Checks/CDSCheck.js +197 -0
  57. package/dist/Checks/CDSCheck.js.map +1 -0
  58. package/dist/Checks/index.d.ts +1 -0
  59. package/dist/Checks/index.js +5 -0
  60. package/dist/Checks/index.js.map +1 -0
  61. package/dist/Common/index.d.ts +1 -0
  62. package/dist/Common/index.js +5 -0
  63. package/dist/Common/index.js.map +1 -0
  64. package/dist/Common/jwtPayload.d.ts +12 -0
  65. package/dist/Common/jwtPayload.js +16 -0
  66. package/dist/Common/jwtPayload.js.map +1 -0
  67. package/dist/GFF3/gff3ToAnnotationFeature.d.ts +3 -0
  68. package/dist/GFF3/gff3ToAnnotationFeature.js +211 -0
  69. package/dist/GFF3/gff3ToAnnotationFeature.js.map +1 -0
  70. package/dist/GFF3/gff3ToAnnotationFeature.test.d.ts +1 -0
  71. package/dist/GFF3/gff3ToAnnotationFeature.test.js +174 -0
  72. package/dist/GFF3/gff3ToAnnotationFeature.test.js.map +1 -0
  73. package/dist/GFF3/gffReservedKeys.d.ts +5 -0
  74. package/dist/GFF3/gffReservedKeys.js +34 -0
  75. package/dist/GFF3/gffReservedKeys.js.map +1 -0
  76. package/dist/GFF3/index.d.ts +2 -0
  77. package/dist/GFF3/index.js +6 -0
  78. package/dist/GFF3/index.js.map +1 -0
  79. package/dist/Messages.d.ts +28 -0
  80. package/dist/Messages.js +3 -0
  81. package/dist/Messages.js.map +1 -0
  82. package/dist/Operations/GetAssembliesOperation.d.ts +13 -0
  83. package/dist/Operations/GetAssembliesOperation.js +20 -0
  84. package/dist/Operations/GetAssembliesOperation.js.map +1 -0
  85. package/dist/Operations/GetFeaturesOperation.d.ts +26 -0
  86. package/dist/Operations/GetFeaturesOperation.js +42 -0
  87. package/dist/Operations/GetFeaturesOperation.js.map +1 -0
  88. package/dist/Operations/index.d.ts +8 -0
  89. package/dist/Operations/index.js +10 -0
  90. package/dist/Operations/index.js.map +1 -0
  91. package/dist/Validations/CoreValidation.d.ts +17 -0
  92. package/dist/Validations/CoreValidation.js +36 -0
  93. package/dist/Validations/CoreValidation.js.map +1 -0
  94. package/dist/Validations/ParentChildValidation.d.ts +17 -0
  95. package/dist/Validations/ParentChildValidation.js +61 -0
  96. package/dist/Validations/ParentChildValidation.js.map +1 -0
  97. package/dist/Validations/Validation.d.ts +27 -0
  98. package/dist/Validations/Validation.js +27 -0
  99. package/dist/Validations/Validation.js.map +1 -0
  100. package/dist/Validations/ValidationSet.d.ts +24 -0
  101. package/dist/Validations/ValidationSet.js +86 -0
  102. package/dist/Validations/ValidationSet.js.map +1 -0
  103. package/dist/Validations/index.d.ts +4 -0
  104. package/dist/Validations/index.js +8 -0
  105. package/dist/Validations/index.js.map +1 -0
  106. package/dist/Validations/soSequenceTypes.d.ts +2 -0
  107. package/dist/Validations/soSequenceTypes.js +1868 -0
  108. package/dist/Validations/soSequenceTypes.js.map +1 -0
  109. package/dist/index.d.ts +8 -0
  110. package/dist/index.js +12 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/tsconfig.tsbuildinfo +1 -0
  113. package/dist/util.d.ts +4 -0
  114. package/dist/util.js +102 -0
  115. package/dist/util.js.map +1 -0
  116. package/package.json +8 -5
  117. package/src/Changes/AddAssemblyAndFeaturesFromFileChange.ts +10 -6
  118. package/src/Changes/AddAssemblyFromExternalChange.ts +4 -1
  119. package/src/Changes/AddAssemblyFromFileChange.ts +138 -41
  120. package/src/Changes/ImportJBrowseConfigChange.ts +2 -1
  121. package/src/Checks/CDSCheck.ts +202 -252
  122. package/src/GFF3/gff3ToAnnotationFeature.test.ts +165 -5
  123. package/src/GFF3/gff3ToAnnotationFeature.ts +16 -16
  124. package/src/util.ts +1 -0
  125. package/test_data/braker.gff +13 -0
  126. package/test_data/example01.gff3 +26 -0
  127. package/test_data/example01.json +236 -0
  128. package/test_data/example02.json +225 -0
  129. package/test_data/example04.json +225 -0
  130. package/test_data/example05.gff3 +30 -0
  131. package/test_data/example06.gff3 +30 -0
  132. package/test_data/example07.gff3 +30 -0
  133. package/test_data/gene_mrna.gff3 +4 -0
  134. package/test_data/gene_representations.gff3 +1781 -0
  135. package/test_data/one_cds.gff3 +9 -0
  136. package/test_data/one_cds.json +67 -0
  137. package/test_data/two_cds.gff3 +9 -0
  138. package/test_data/two_cds.json +67 -0
package/dist/util.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { AnnotationFeatureSnapshot } from '@apollo-annotation/mst';
2
+ import { GFF3Feature } from '@gmod/gff';
3
+ export declare function makeGFF3Feature(feature: AnnotationFeatureSnapshot, parentId?: string, refSeqNames?: Record<string, string | undefined>): GFF3Feature;
4
+ export declare function splitStringIntoChunks(input: string, chunkSize: number): string[];
package/dist/util.js ADDED
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.makeGFF3Feature = makeGFF3Feature;
5
+ exports.splitStringIntoChunks = splitStringIntoChunks;
6
+ function makeGFF3Feature(feature, parentId, refSeqNames) {
7
+ const locations = [{ start: feature.min, end: feature.max }];
8
+ // const locations = feature.discontinuousLocations?.length
9
+ // ? feature.discontinuousLocations
10
+ // : [{ start: feature.start, end: feature.end, phase: feature.phase }]
11
+ const attributes = JSON.parse(JSON.stringify(feature.attributes));
12
+ const ontologyTerms = [];
13
+ const source = feature.attributes?.source?.[0] ?? null;
14
+ delete attributes.source;
15
+ if (parentId) {
16
+ attributes.Parent = [parentId];
17
+ }
18
+ if (attributes._id) {
19
+ attributes.ID = attributes._id;
20
+ delete attributes._id;
21
+ }
22
+ if (attributes.gff_name) {
23
+ attributes.Name = attributes.gff_name;
24
+ delete attributes.gff_name;
25
+ }
26
+ if (attributes.gff_alias) {
27
+ attributes.Alias = attributes.gff_alias;
28
+ delete attributes.gff_alias;
29
+ }
30
+ if (attributes.gff_target) {
31
+ attributes.Target = attributes.gff_target;
32
+ delete attributes.gff_target;
33
+ }
34
+ if (attributes.gff_gap) {
35
+ attributes.Gap = attributes.gff_gap;
36
+ delete attributes.gff_gap;
37
+ }
38
+ if (attributes.gff_derives_from) {
39
+ attributes.Derives_from = attributes.gff_derives_from;
40
+ delete attributes.gff_derives_from;
41
+ }
42
+ if (attributes.gff_note) {
43
+ attributes.Note = attributes.gff_note;
44
+ delete attributes.gff_note;
45
+ }
46
+ if (attributes.gff_dbxref) {
47
+ attributes.Dbxref = attributes.gff_dbxref;
48
+ delete attributes.gff_dbxref;
49
+ }
50
+ if (attributes.gff_is_circular) {
51
+ attributes.Is_circular = attributes.gff_is_circular;
52
+ delete attributes.gff_is_circular;
53
+ }
54
+ if (attributes.gff_ontology_term) {
55
+ ontologyTerms.push(...attributes.gff_ontology_term);
56
+ delete attributes.gff_ontology_term;
57
+ }
58
+ if (attributes['Gene Ontology']) {
59
+ ontologyTerms.push(...attributes['Gene Ontology']);
60
+ delete attributes['Gene Ontology'];
61
+ }
62
+ if (attributes['Sequence Ontology']) {
63
+ ontologyTerms.push(...attributes['Sequence Ontology']);
64
+ delete attributes['Sequence Ontology'];
65
+ }
66
+ if (ontologyTerms.length > 0) {
67
+ attributes.Ontology_term = ontologyTerms;
68
+ }
69
+ return locations.map((location) => ({
70
+ start: location.start + 1,
71
+ end: location.end,
72
+ seq_id: refSeqNames ? refSeqNames[feature.refSeq] ?? null : feature.refSeq,
73
+ source,
74
+ type: feature.type,
75
+ score: null,
76
+ // score: feature.score ?? null,
77
+ strand: feature.strand ? (feature.strand === 1 ? '+' : '-') : null,
78
+ phase: null,
79
+ // phase:
80
+ // location.phase === 0
81
+ // ? '0'
82
+ // : location.phase === 1
83
+ // ? '1'
84
+ // : location.phase === 2
85
+ // ? '2'
86
+ // : null,
87
+ attributes: Object.keys(attributes).length > 0 ? attributes : null,
88
+ derived_features: [],
89
+ child_features: feature.children
90
+ ? Object.values(feature.children).map((child) => makeGFF3Feature(child, attributes.ID?.[0], refSeqNames))
91
+ : [],
92
+ }));
93
+ }
94
+ function splitStringIntoChunks(input, chunkSize) {
95
+ const chunks = [];
96
+ for (let i = 0; i < input.length; i += chunkSize) {
97
+ const chunk = input.slice(i, i + chunkSize);
98
+ chunks.push(chunk);
99
+ }
100
+ return chunks;
101
+ }
102
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@apollo-annotation/shared",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "main": "./dist/index.js",
5
5
  "scripts": {
6
- "start": "tsc --build --watch",
7
6
  "build": "yarn clean && tsc --build",
8
7
  "clean": "rimraf dist",
8
+ "start": "tsc --build --watch",
9
9
  "test": "glob -c \"tsx --test --test-reporter spec \" \"**/*.test.ts\"",
10
10
  "test:ci": "NODE_V8_COVERAGE=./coverage glob -c \"tsx --test --test-reporter spec --experimental-test-coverage \" \"**/*.test.ts\""
11
11
  },
12
12
  "dependencies": {
13
- "@apollo-annotation/common": "^0.1.19",
14
- "@apollo-annotation/mst": "^0.1.19",
15
- "@apollo-annotation/schemas": "^0.1.19",
13
+ "@apollo-annotation/common": "^0.1.21",
14
+ "@apollo-annotation/mst": "^0.1.21",
15
+ "@apollo-annotation/schemas": "^0.1.21",
16
16
  "@gmod/gff": "1.2.0",
17
17
  "@gmod/indexedfasta": "^2.0.4",
18
18
  "@jbrowse/core": "^2.13.1",
@@ -26,8 +26,11 @@
26
26
  "devDependencies": {
27
27
  "@nestjs/common": "^10.1.0",
28
28
  "@nestjs/core": "^10.1.0",
29
+ "@types/chai": "^4.3.19",
29
30
  "@types/node": "^18.14.2",
30
31
  "@types/rimraf": "^3",
32
+ "chai": "^5.1.1",
33
+ "chai-exclude": "^3.0.0",
31
34
  "glob": "^11.0.0",
32
35
  "mobx": "^6.6.1",
33
36
  "mobx-state-tree": "^5.1.7",
@@ -18,7 +18,7 @@ export interface SerializedAddAssemblyAndFeaturesFromFileChangeBase
18
18
 
19
19
  export interface AddAssemblyAndFeaturesFromFileChangeDetails {
20
20
  assemblyName: string
21
- fileId: string
21
+ fileIds: { fa: string }
22
22
  }
23
23
 
24
24
  export interface SerializedAddAssemblyAndFeaturesFromFileChangeSingle
@@ -53,8 +53,8 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
53
53
  toJSON(): SerializedAddAssemblyAndFeaturesFromFileChange {
54
54
  const { assembly, changes, typeName } = this
55
55
  if (changes.length === 1) {
56
- const [{ assemblyName, fileId }] = changes
57
- return { typeName, assembly, assemblyName, fileId }
56
+ const [{ assemblyName, fileIds }] = changes
57
+ return { typeName, assembly, assemblyName, fileIds }
58
58
  }
59
59
  return { typeName, assembly, changes }
60
60
  }
@@ -65,10 +65,11 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
65
65
  * @returns
66
66
  */
67
67
  async executeOnServer(backend: ServerDataStore) {
68
- const { assemblyModel, fileModel, filesService, user } = backend
68
+ const { assemblyModel, checkModel, fileModel, filesService, user } = backend
69
69
  const { assembly, changes, logger } = this
70
70
  for (const change of changes) {
71
- const { assemblyName, fileId } = change
71
+ const { assemblyName, fileIds } = change
72
+ const fileId = fileIds.fa
72
73
 
73
74
  const { FILE_UPLOAD_FOLDER } = process.env
74
75
  if (!FILE_UPLOAD_FOLDER) {
@@ -88,9 +89,12 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
88
89
  if (assemblyDoc) {
89
90
  throw new Error(`Assembly "${assemblyName}" already exists`)
90
91
  }
92
+ // get checks
93
+ const checkDocs = await checkModel.find({ default: true }).exec()
94
+ const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
91
95
  // Add assembly
92
96
  const [newAssemblyDoc] = await assemblyModel.create([
93
- { _id: assembly, name: assemblyName, user, status: -1 },
97
+ { _id: assembly, name: assemblyName, user, status: -1, fileId, checks },
94
98
  ])
95
99
  logger.debug?.(
96
100
  `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id.toHexString()}"`,
@@ -67,7 +67,7 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
67
67
  * @returns
68
68
  */
69
69
  async executeOnServer(backend: ServerDataStore) {
70
- const { assemblyModel, refSeqModel, user } = backend
70
+ const { assemblyModel, checkModel, refSeqModel, user } = backend
71
71
  const { assembly, changes, logger } = this
72
72
  const { CHUNK_SIZE } = process.env
73
73
  const customChunkSize = CHUNK_SIZE && Number(CHUNK_SIZE)
@@ -97,6 +97,8 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
97
97
  if (assemblyDoc) {
98
98
  throw new Error(`Assembly "${assemblyName}" already exists`)
99
99
  }
100
+ const checkDocs = await checkModel.find({ default: true }).exec()
101
+ const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
100
102
  const [newAssemblyDoc] = await assemblyModel.create([
101
103
  {
102
104
  _id: assembly,
@@ -104,6 +106,7 @@ export class AddAssemblyFromExternalChange extends AssemblySpecificChange {
104
106
  user,
105
107
  status: -1,
106
108
  externalLocation,
109
+ checks,
107
110
  },
108
111
  ])
109
112
  logger.debug?.(
@@ -7,6 +7,7 @@ import {
7
7
  SerializedAssemblySpecificChange,
8
8
  ServerDataStore,
9
9
  } from '@apollo-annotation/common'
10
+ import { BgzipIndexedFasta } from '@gmod/indexedfasta'
10
11
 
11
12
  import { FromFileBaseChange } from './FromFileBaseChange'
12
13
 
@@ -17,7 +18,7 @@ export interface SerializedAddAssemblyFromFileChangeBase
17
18
 
18
19
  export interface AddAssemblyFromFileChangeDetails {
19
20
  assemblyName: string
20
- fileId: string
21
+ fileIds: { fa: string } | { fa: string; fai: string; gzi: string }
21
22
  }
22
23
 
23
24
  export interface SerializedAddAssemblyFromFileChangeSingle
@@ -52,8 +53,8 @@ export class AddAssemblyFromFileChange extends FromFileBaseChange {
52
53
  toJSON(): SerializedAddAssemblyFromFileChange {
53
54
  const { assembly, changes, typeName } = this
54
55
  if (changes.length === 1) {
55
- const [{ assemblyName, fileId }] = changes
56
- return { typeName, assembly, assemblyName, fileId }
56
+ const [{ assemblyName, fileIds }] = changes
57
+ return { typeName, assembly, assemblyName, fileIds }
57
58
  }
58
59
  return { typeName, assembly, changes }
59
60
  }
@@ -64,49 +65,145 @@ export class AddAssemblyFromFileChange extends FromFileBaseChange {
64
65
  * @returns
65
66
  */
66
67
  async executeOnServer(backend: ServerDataStore) {
67
- const { assemblyModel, fileModel, user } = backend
68
- const { assembly, changes, logger } = this
69
-
68
+ const { changes } = this
70
69
  for (const change of changes) {
71
- const { assemblyName, fileId } = change
72
-
73
- const { FILE_UPLOAD_FOLDER } = process.env
74
- if (!FILE_UPLOAD_FOLDER) {
75
- throw new Error('No FILE_UPLOAD_FOLDER found in .env file')
76
- }
77
- // Get file checksum
78
- const fileDoc = await fileModel.findById(fileId).exec()
79
- if (!fileDoc) {
80
- throw new Error(`File "${fileId}" not found in Mongo`)
81
- }
82
- logger.debug?.(`FileId "${fileId}", checksum "${fileDoc.checksum}"`)
83
-
84
- // Check and add new assembly
85
- const assemblyDoc = await assemblyModel
86
- .findOne({ name: assemblyName })
87
- .exec()
88
- if (assemblyDoc) {
89
- throw new Error(`Assembly "${assemblyName}" already exists`)
90
- }
91
- // Add assembly
92
- const [newAssemblyDoc] = await assemblyModel.create([
93
- { _id: assembly, name: assemblyName, user, status: -1 },
70
+ const { assemblyName, fileIds } = change
71
+ await ('gzi' in fileIds
72
+ ? this.executeOnServerIndexed(backend, assemblyName, fileIds)
73
+ : this.executeOnServerFasta(backend, assemblyName, fileIds.fa))
74
+ }
75
+ }
76
+
77
+ async executeOnServerIndexed(
78
+ backend: ServerDataStore,
79
+ assemblyName: string,
80
+ fileIds: { fa: string; fai: string; gzi: string },
81
+ ) {
82
+ const { CHUNK_SIZE } = process.env
83
+ const customChunkSize = CHUNK_SIZE && Number(CHUNK_SIZE)
84
+
85
+ const { FILE_UPLOAD_FOLDER } = process.env
86
+ if (!FILE_UPLOAD_FOLDER) {
87
+ throw new Error('No FILE_UPLOAD_FOLDER found in .env file')
88
+ }
89
+
90
+ const { fa, fai, gzi } = fileIds
91
+ const {
92
+ assemblyModel,
93
+ checkModel,
94
+ fileModel,
95
+ filesService,
96
+ refSeqModel,
97
+ user,
98
+ } = backend
99
+
100
+ const faDoc = await fileModel.findById(fa)
101
+ const faChecksum = faDoc?.checksum
102
+ if (!faChecksum) {
103
+ throw new Error(`No checksum for file document ${faDoc}`)
104
+ }
105
+
106
+ const faiDoc = await fileModel.findById(fai)
107
+ const faiChecksum = faiDoc?.checksum
108
+ if (!faiChecksum) {
109
+ throw new Error(`No checksum for file document ${faiDoc}`)
110
+ }
111
+
112
+ const gziDoc = await fileModel.findById(gzi)
113
+ const gziChecksum = gziDoc?.checksum
114
+ if (!gziChecksum) {
115
+ throw new Error(`No checksum for file document ${gziDoc}`)
116
+ }
117
+
118
+ const sequenceAdapter = new BgzipIndexedFasta({
119
+ fasta: filesService.getFileHandle(faDoc),
120
+ fai: filesService.getFileHandle(faiDoc),
121
+ gzi: filesService.getFileHandle(gziDoc),
122
+ })
123
+ const allSequenceSizes = await sequenceAdapter.getSequenceSizes()
124
+
125
+ const assemblyDoc = await assemblyModel
126
+ .findOne({ name: assemblyName })
127
+ .exec()
128
+ if (assemblyDoc) {
129
+ throw new Error(`Assembly "${assemblyName}" already exists`)
130
+ }
131
+ const checkDocs = await checkModel.find({ default: true }).exec()
132
+ const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
133
+ const [newAssemblyDoc] = await assemblyModel.create([
134
+ {
135
+ _id: this.assembly,
136
+ name: assemblyName,
137
+ user,
138
+ status: -1,
139
+ fileIds,
140
+ checks,
141
+ },
142
+ ])
143
+ this.logger.debug?.(
144
+ `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
145
+ )
146
+
147
+ for (const sequenceName in allSequenceSizes) {
148
+ const [newRefSeqDoc] = await refSeqModel.create([
149
+ {
150
+ name: sequenceName,
151
+ assembly: newAssemblyDoc._id,
152
+ length: allSequenceSizes[sequenceName],
153
+ ...(customChunkSize ? { chunkSize: customChunkSize } : null),
154
+ user,
155
+ status: -1,
156
+ },
94
157
  ])
95
- logger.debug?.(
96
- `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
97
- )
98
- logger.debug?.(
99
- `File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
158
+ this.logger.debug?.(
159
+ `Added new refSeq "${sequenceName}", docId "${newRefSeqDoc._id}"`,
100
160
  )
161
+ }
162
+ }
101
163
 
102
- // Add refSeqs
103
- // We cannot use Mongo 'session' / transaction here because Mongo has 16 MB limit for transaction
104
- await this.addRefSeqIntoDb(
105
- fileDoc,
106
- newAssemblyDoc._id.toString(),
107
- backend,
108
- )
164
+ async executeOnServerFasta(
165
+ backend: ServerDataStore,
166
+ assemblyName: string,
167
+ fileId: string,
168
+ ) {
169
+ const { assemblyModel, checkModel, fileModel, user } = backend
170
+ // Get file checksum
171
+ const fileDoc = await fileModel.findById(fileId).exec()
172
+ if (!fileDoc) {
173
+ throw new Error(`File "${fileId}" not found in Mongo`)
174
+ }
175
+ this.logger.debug?.(`FileId "${fileId}", checksum "${fileDoc.checksum}"`)
176
+
177
+ // Check and add new assembly
178
+ const assemblyDoc = await assemblyModel
179
+ .findOne({ name: assemblyName })
180
+ .exec()
181
+ if (assemblyDoc) {
182
+ throw new Error(`Assembly "${assemblyName}" already exists`)
109
183
  }
184
+ const checkDocs = await checkModel.find({ default: true }).exec()
185
+ const checks = checkDocs.map((checkDoc) => checkDoc._id.toHexString())
186
+ // Add assembly
187
+ const [newAssemblyDoc] = await assemblyModel.create([
188
+ {
189
+ _id: this.assembly,
190
+ name: assemblyName,
191
+ user,
192
+ status: -1,
193
+ fileIds: { fa: fileId },
194
+ checks,
195
+ },
196
+ ])
197
+ this.logger.debug?.(
198
+ `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
199
+ )
200
+ this.logger.debug?.(
201
+ `File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
202
+ )
203
+
204
+ // Add refSeqs
205
+ // We cannot use Mongo 'session' / transaction here because Mongo has 16 MB limit for transaction
206
+ await this.addRefSeqIntoDb(fileDoc, newAssemblyDoc._id.toString(), backend)
110
207
  }
111
208
 
112
209
  async executeOnLocalGFF3(_backend: LocalGFF3DataStore) {
@@ -39,7 +39,8 @@ export interface SerializedImportJBrowseConfigChange {
39
39
  }
40
40
 
41
41
  export function filterJBrowseConfig(config: JBrowseConfig): JBrowseConfig {
42
- const { assemblies, internetAccounts, plugins, tracks, ...rest } = config
42
+ const { __v, _id, assemblies, internetAccounts, plugins, tracks, ...rest } =
43
+ config
43
44
  const filteredAssemblies = assemblies?.filter(
44
45
  (a) => a.sequence.adapter.type !== 'ApolloSequenceAdapter',
45
46
  )