* init: copy PI files * feat: add subscribers, refactor strategies folder * wip: strategies integration tests package * fix: rename * wip: use redis * wip: use redis deps, redis setup in local tests * fix: naming collision, medusa config * fix: typing, update apply changes for new event ordering and reimplement interface * feat: make redis container run in integration tests * fix: missing yarn lock * feat: redis setup v2 * fix: setup server imports * fix: a lot of integration issues * fix: a lot of integration issues v2, transform tags, fix `ops` object parsing * wip: parsing product options * feat: ✨creating product and variants works, processing product/variant options, update schema * fix: query keys, logic for finding existing variant * fix: types * feat: update product variant's options * feat: parse MA records * feat: creating/updating MA records, region detection, error handling * feat: throw an error when creating an MA for nonexistent region * refactor: remove unused methods * refactor: use provided ids to track records, extract a couple of methods * refactor: remove unused method * refactor/wip: add initial comment for main methods * refactor: replace usage of RedisJSON functionality with basic k/v api * feat: async progress report * types: define more precise types, cleanup * feat: error handling * feat: unit testing preprocessing * feat: integration testing for CI, fix legacy bug where user is unable to create a variant if regional price is also sent as payload, add csv for integration tests * fix: error throw for logs * feat: add product endpoint snap * refactor: remove log * feat: add snaps, rebase * refactor: add comments * feat: snap update * refactor: typo * refactor: change error handler * feat: Redis cleanup after the job is done * testing :fix product unit test, remove integration snap, add inline object matcher * testing: fix obsolete snaps * refactor: update comments * fix: rebase issue * fix: rebase issue v2, remove log form an integration test * fix: try reverting setup server * fix: insert variants test * refactor: don't pass tx manager, refactor methods * refactor: don't use regionRepo, add `retrieveByName` to region repo * refactor: don't use productRepo * refactor: don't use `productVariantRepo` * refactor: remove repo mocks from unit tests * fix: product import unit tests * feat: file cleanup on finalize, kill test logs * wip: use files to persist ops instead of redis, move strategy class into `batch-job` folder * fix: minio delete method, add file cleanup method to import, fix promise coordination * fix: replace redis methods * feat: store import ops as a file instead of Redis * feat: test cleanup * fix: change unit tests after Redis logic removal * feat: use `results` for progress reporting, add `stat_descriptors` info after preprocessing, remove redis mentions * feat: extract to other files, use directory from property, fix strategy loader to allow other files in `strategies` directory * feat: fix instance progress counter * fix: mock services types * fix: update snaps * fix: error handling stream, fix test file service name generation * fix: remove dir with tmp files after testing * fix: new yarn.lock after rebase * fix: remove log, change object shape * fix: add DI types * refactor: remove container as a csv parser dep * fix: remove seeder, change typings * refactor: reimplement `retrieveByName` in the region service * fix: unit tests typings * fix: remove ts-ignore, complete typings for csv parser validators * fix: don't keep track of progress since it is redundant and only keep track of `advancement_count` * fix: return of the batch job seeder * fix: update find region by name method * fix: update types for service typings * fix: update redis type usage * fix: update unit tests file * fix: unit tests * fix: remove redis from integration test * feat: refactor region retrieval by name * feat: refactor product option update * fix: remove repo import * fix: return redis in test * fix: handle stream error * fix: tmp data cleanup Co-authored-by: fPolic <frane@medusajs.com>
78 lines
1.9 KiB
JavaScript
78 lines
1.9 KiB
JavaScript
import { AbstractFileService } from "@medusajs/medusa"
|
|
import stream from "stream"
|
|
import * as fs from "fs"
|
|
import * as path from "path"
|
|
|
|
export default class LocalFileService extends AbstractFileService {
|
|
// eslint-disable-next-line no-empty-pattern
|
|
constructor({}, options) {
|
|
super({})
|
|
this.upload_dir_ =
|
|
process.env.UPLOAD_DIR ?? options.upload_dir ?? "uploads/images"
|
|
|
|
if (!fs.existsSync(this.upload_dir_)) {
|
|
fs.mkdirSync(this.upload_dir_)
|
|
}
|
|
}
|
|
|
|
async upload(file) {
|
|
const uploadPath = path.join(
|
|
this.upload_dir_,
|
|
path.dirname(file.originalname)
|
|
)
|
|
|
|
if (!fs.existsSync(uploadPath)) {
|
|
fs.mkdirSync(uploadPath, { recursive: true })
|
|
}
|
|
|
|
const filePath = path.resolve(this.upload_dir_, file.originalname)
|
|
fs.writeFile(filePath, "", (error) => {
|
|
if (error) {
|
|
throw error
|
|
}
|
|
})
|
|
return { url: filePath }
|
|
}
|
|
|
|
async delete({ name }) {
|
|
return new Promise((resolve, _) => {
|
|
const path = resolve(this.upload_dir_, name)
|
|
fs.unlink(path, (err) => {
|
|
if (err) {
|
|
throw err
|
|
}
|
|
|
|
resolve("file unlinked")
|
|
})
|
|
})
|
|
}
|
|
|
|
async getUploadStreamDescriptor({ name, ext }) {
|
|
const fileKey = `${name}.${ext}`
|
|
const filePath = path.resolve(this.upload_dir_, fileKey)
|
|
|
|
const isFileExists = fs.existsSync(filePath)
|
|
if (!isFileExists) {
|
|
await this.upload({ originalname: fileKey })
|
|
}
|
|
|
|
const pass = new stream.PassThrough()
|
|
pass.pipe(fs.createWriteStream(filePath))
|
|
|
|
return {
|
|
writeStream: pass,
|
|
promise: Promise.resolve(),
|
|
url: `${this.upload_dir_}/${fileKey}`,
|
|
fileKey,
|
|
}
|
|
}
|
|
|
|
async getDownloadStream(fileData) {
|
|
const filePath = path.resolve(
|
|
this.upload_dir_,
|
|
fileData.fileKey + (fileData.ext ? `.${fileData.ext}` : "")
|
|
)
|
|
return fs.createReadStream(filePath)
|
|
}
|
|
}
|