agmission/Development/server/model/export_job.js

35 lines
1.4 KiB
JavaScript

'use strict';
const mongoose = require('mongoose'), Schema = mongoose.Schema;
const { ExportUnits } = require('../helpers/constants');
/**
* ExportJob model — tracks async CSV/GeoJSON export requests.
*
* Lifecycle: pending → processing → ready | error
* Files are written to env.TEMP_DIR and expire after EXPORT_TTL_HOURS.
* The download endpoint streams the file and then schedules deletion.
*/
const schema = new Schema({
owner: { type: Schema.Types.ObjectId, ref: 'User', required: true, index: true },
jobId: { type: Number, required: true },
format: { type: String, enum: ['csv', 'geojson'], required: true },
interval: { type: Number, default: null }, // GPS point thinning interval in seconds, null = all points
units: { type: String, enum: Object.values(ExportUnits), default: ExportUnits.METRIC }, // output measurement system
status: {
type: String,
enum: ['pending', 'processing', 'ready', 'error'],
default: 'pending',
index: true
},
filePath: { type: String }, // absolute path on disk, set when ready
errorMsg: { type: String },
createdAt: { type: Date, default: Date.now, index: true },
expiresAt: { type: Date } // TTL; file and record deleted after this time
});
// Auto-expire documents from MongoDB after expiresAt (background cleanup)
schema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
module.exports = mongoose.model('ExportJob', schema);