"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppService = void 0;
const common_1 = require("@nestjs/common");
const fs = require("fs-extra");
let AppService = class AppService {
    saveGridFailures(sits, res) {
        const jsonString = JSON.stringify(sits);
        return fs.writeFile('./store/public-sits.json', jsonString, err => {
            if (err) {
                throw err;
            }
            else {
                res(true, 'Successfully wrote file');
            }
        });
    }
    getSITs(res) {
        fs.readFile('./store/public-sits.json', 'utf8', function (err, data) {
            if (err)
                throw err;
            else
                res(data);
        });
    }
};
AppService = __decorate([
    common_1.Injectable()
], AppService);
exports.AppService = AppService;
//# sourceMappingURL=app.service.js.map