---
# System prepended metadata

title: Processor that saves the data in a database

---

# Processor that saves the data in a database

## First proposal

A processor should be agnostic of a database and does not always save data in a database.

```typescript
import { saveAnalysis } from '@mylims/base-processor';
import { fromB1505, toJcamp } from 'iv-spectrum';

export async function processB1505(filename, content) {
  const value = content.toString();
  const analyses = fromB1505(value);
  const username = filename.split('_')[0];
  const sampleCode = filename.split('_').slice(1);
  
  for (const analysis of analyses) {
    const jcamp = toJcamp(analysis);
    
    // Set the status of this data to error
    if (!analysis.meta.resistance) throw new Error('test');
    
    await saveMeasurement({
      username,
      sampleId,
      collection: 'iv',
      derived,
      file: jcamp,
    });
  }
  
  // if return then change the status to success
}
```

Example of a not-saving process

```typescript
import { saveAnalysis } from '@mylims/base-processor';
import { fromB1505, toJcamp } from 'iv-spectrum';

export async function processB1505(filename, content) {
  const value = content.toString();
  const analyses = fromB1505(value);
  const username = filename.split('_')[0];
  const sampleCode = filename.split('_').slice(1);
  
  for (const analysis of analyses) {
    const jcamp = toJcamp(analysis);
    
    // Set the status of this data to error
    if (!analysis.meta.resistance) throw new Error('test');
    
    await fetch('test').then(res => res.text());
  }
  
  // if return then change the status to success
  return true;
}
```


## Second proposal

Saving on sample

```typescript
import type { ProcessorType } from '@mylims/base-processor/lib/types';
import { fromB1505, toJcamp } from 'iv-spectrum';

export async function processB1505(Processor: ProcessorType) {
  const processor = new Processor({ topic: 'b1505', collection: 'iv' });
  // username can be specified from CLI
  processor.setUsername(username => username ?? filename);

  const { content, filename } = await processor.getNextFile();
  const value = content.toString('utf-9');
  const analyses = fromB1505(value);
  
  // Set the status of this data to error
  if (analyses.length < 1) throw new Error('Missing analyses');

  for (const analysis of analyses) {
    const jcamp = toJcamp(analysis);
    await processor.addFile({
      file: jcamp,
      filename: `${filename}.jdx`,
      sampleCode: [filename],
      collection: 'iv'
    });
  }
  return processor.done();
};
```

Example of a not-saving process

```typescript
import type { ProcessorType } from '@mylims/base-processor/lib/types';
import { fromB1505, toJcamp } from 'iv-spectrum';

export async function processB1505(Processor: ProcessorType) {
  const processor = Processor({ topic: 'b1505', collection: 'iv' });

  const { content, filename } = await processor.getNextFile();
  const value = content.toString();
  const analyses = fromB1505(value);
  
  // Set the status of this data to error
  if (analyses.length < 1) throw new Error('Missing analyses');

  for (const analysis of analyses) {
    const jcamp = toJcamp(analysis);
    await fetch('test').then(res => res.text())
  }
  return processor.done();
};
```

## Third proposal

Saving on sample

```typescript
import { Processor, FileError } from '@mylims/base-processor';
import { fromB1505, toJcamp } from 'iv-spectrum';

export default {
    topic: 'b1505',
    process: processB1505,
    autoCreateSample: false,
} as ProcessorConfig;

async function processB1505(processor: Processor) {
    if (! processor.file) {
        throw new FileError('Missing file');
    }
    const {filename, dirname, extension} = processor.file;
    // filename: 'patiny_LP1234_F1.jdx'
    const userId = filename.split('_')[0];
    const sampleCode = filename.split('_').slice(1);
    const content = await processor.file.read(); // There could be another method to get a stream.
    const analyses = fromB1505(content: TextData); // ensure-string
    //  type is coming from: https://github.com/cheminfo/cheminfo-types/blob/main/src/core/TextData.d.ts
 
    const uuid10 = base62
    
    // Set the status of this data to error
    if (analyses.length < 1) throw new FileError('Missing analyses');

    for (const analysis of analyses) {
      const jcamp = toJcamp(analysis);
        
      processor.addMeasurement({
        file: {
            content: jcamp, // Think about referring to a path on disk to avoid too many big files in memory
            absolutePath, // alternative to content
            filename: `${filename}.jdx`,
            mimetype?: 'chemical/x-jcamp-dx',
        }
        measurementType: 'iv',
        derivedData,
        sampleCode, 
        userId,
      // or uuid10 (alternative to sampleCode + userId)
      }, {
          autoCreateSample: true,
      });
    }
};
```
