@apollo-annotation/shared 0.1.19 → 0.1.20

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 (136) hide show
  1. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.d.ts +33 -0
  2. package/dist/Changes/AddAssemblyAndFeaturesFromFileChange.js +83 -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 +97 -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 +140 -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 +6 -5
  118. package/src/Changes/AddAssemblyFromFileChange.ts +126 -41
  119. package/src/Checks/CDSCheck.ts +202 -252
  120. package/src/GFF3/gff3ToAnnotationFeature.test.ts +165 -5
  121. package/src/GFF3/gff3ToAnnotationFeature.ts +16 -16
  122. package/src/util.ts +1 -0
  123. package/test_data/braker.gff +13 -0
  124. package/test_data/example01.gff3 +26 -0
  125. package/test_data/example01.json +236 -0
  126. package/test_data/example02.json +225 -0
  127. package/test_data/example04.json +225 -0
  128. package/test_data/example05.gff3 +30 -0
  129. package/test_data/example06.gff3 +30 -0
  130. package/test_data/example07.gff3 +30 -0
  131. package/test_data/gene_mrna.gff3 +4 -0
  132. package/test_data/gene_representations.gff3 +1781 -0
  133. package/test_data/one_cds.gff3 +9 -0
  134. package/test_data/one_cds.json +67 -0
  135. package/test_data/two_cds.gff3 +9 -0
  136. 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.20",
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.20",
14
+ "@apollo-annotation/mst": "^0.1.20",
15
+ "@apollo-annotation/schemas": "^0.1.20",
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
  }
@@ -68,7 +68,8 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
68
68
  const { assemblyModel, 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) {
@@ -90,7 +91,7 @@ export class AddAssemblyAndFeaturesFromFileChange extends FromFileBaseChange {
90
91
  }
91
92
  // Add assembly
92
93
  const [newAssemblyDoc] = await assemblyModel.create([
93
- { _id: assembly, name: assemblyName, user, status: -1 },
94
+ { _id: assembly, name: assemblyName, user, status: -1, fileId },
94
95
  ])
95
96
  logger.debug?.(
96
97
  `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id.toHexString()}"`,
@@ -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,133 @@ 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 { assemblyModel, fileModel, filesService, refSeqModel, user } =
92
+ backend
93
+
94
+ const faDoc = await fileModel.findById(fa)
95
+ const faChecksum = faDoc?.checksum
96
+ if (!faChecksum) {
97
+ throw new Error(`No checksum for file document ${faDoc}`)
98
+ }
99
+
100
+ const faiDoc = await fileModel.findById(fai)
101
+ const faiChecksum = faiDoc?.checksum
102
+ if (!faiChecksum) {
103
+ throw new Error(`No checksum for file document ${faiDoc}`)
104
+ }
105
+
106
+ const gziDoc = await fileModel.findById(gzi)
107
+ const gziChecksum = gziDoc?.checksum
108
+ if (!gziChecksum) {
109
+ throw new Error(`No checksum for file document ${gziDoc}`)
110
+ }
111
+
112
+ const sequenceAdapter = new BgzipIndexedFasta({
113
+ fasta: filesService.getFileHandle(faDoc),
114
+ fai: filesService.getFileHandle(faiDoc),
115
+ gzi: filesService.getFileHandle(gziDoc),
116
+ })
117
+ const allSequenceSizes = await sequenceAdapter.getSequenceSizes()
118
+
119
+ const assemblyDoc = await assemblyModel
120
+ .findOne({ name: assemblyName })
121
+ .exec()
122
+ if (assemblyDoc) {
123
+ throw new Error(`Assembly "${assemblyName}" already exists`)
124
+ }
125
+ const [newAssemblyDoc] = await assemblyModel.create([
126
+ {
127
+ _id: this.assembly,
128
+ name: assemblyName,
129
+ user,
130
+ status: -1,
131
+ fileIds,
132
+ },
133
+ ])
134
+ this.logger.debug?.(
135
+ `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
136
+ )
137
+
138
+ for (const sequenceName in allSequenceSizes) {
139
+ const [newRefSeqDoc] = await refSeqModel.create([
140
+ {
141
+ name: sequenceName,
142
+ assembly: newAssemblyDoc._id,
143
+ length: allSequenceSizes[sequenceName],
144
+ ...(customChunkSize ? { chunkSize: customChunkSize } : null),
145
+ user,
146
+ status: -1,
147
+ },
94
148
  ])
95
- logger.debug?.(
96
- `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
97
- )
98
- logger.debug?.(
99
- `File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
149
+ this.logger.debug?.(
150
+ `Added new refSeq "${sequenceName}", docId "${newRefSeqDoc._id}"`,
100
151
  )
152
+ }
153
+ }
101
154
 
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
- )
155
+ async executeOnServerFasta(
156
+ backend: ServerDataStore,
157
+ assemblyName: string,
158
+ fileId: string,
159
+ ) {
160
+ const { assemblyModel, fileModel, user } = backend
161
+ // Get file checksum
162
+ const fileDoc = await fileModel.findById(fileId).exec()
163
+ if (!fileDoc) {
164
+ throw new Error(`File "${fileId}" not found in Mongo`)
165
+ }
166
+ this.logger.debug?.(`FileId "${fileId}", checksum "${fileDoc.checksum}"`)
167
+
168
+ // Check and add new assembly
169
+ const assemblyDoc = await assemblyModel
170
+ .findOne({ name: assemblyName })
171
+ .exec()
172
+ if (assemblyDoc) {
173
+ throw new Error(`Assembly "${assemblyName}" already exists`)
109
174
  }
175
+ // Add assembly
176
+ const [newAssemblyDoc] = await assemblyModel.create([
177
+ {
178
+ _id: this.assembly,
179
+ name: assemblyName,
180
+ user,
181
+ status: -1,
182
+ fileIds: { fa: fileId },
183
+ },
184
+ ])
185
+ this.logger.debug?.(
186
+ `Added new assembly "${assemblyName}", docId "${newAssemblyDoc._id}"`,
187
+ )
188
+ this.logger.debug?.(
189
+ `File type: "${fileDoc.type}", assemblyId: "${newAssemblyDoc._id}"`,
190
+ )
191
+
192
+ // Add refSeqs
193
+ // We cannot use Mongo 'session' / transaction here because Mongo has 16 MB limit for transaction
194
+ await this.addRefSeqIntoDb(fileDoc, newAssemblyDoc._id.toString(), backend)
110
195
  }
111
196
 
112
197
  async executeOnLocalGFF3(_backend: LocalGFF3DataStore) {