Restructure data holder
This commit is contained in:
parent
41870d90d9
commit
7e152520c2
|
@ -8,6 +8,8 @@ import jsonfile from 'jsonfile'
|
||||||
import { ServerRenderer } from './utils/serverRender'
|
import { ServerRenderer } from './utils/serverRender'
|
||||||
import { Scanner } from './utils/scanner'
|
import { Scanner } from './utils/scanner'
|
||||||
import { DataHolder } from './utils/dataHolder'
|
import { DataHolder } from './utils/dataHolder'
|
||||||
|
import { FileStorage } from './utils/storage/file'
|
||||||
|
import { MongoStorage } from './utils/storage/mongo'
|
||||||
|
|
||||||
const port = process.env.PORT || 3000
|
const port = process.env.PORT || 3000
|
||||||
const app = express()
|
const app = express()
|
||||||
|
@ -45,7 +47,14 @@ if (head == null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const dataHolder = new DataHolder(config)
|
let storage
|
||||||
|
if (config.storage === 'file') {
|
||||||
|
storage = new FileStorage()
|
||||||
|
} else if (config.storage === 'mongo') {
|
||||||
|
storage = new MongoStorage()
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataHolder = new DataHolder(storage)
|
||||||
const scanner = new Scanner(config, dataHolder)
|
const scanner = new Scanner(config, dataHolder)
|
||||||
|
|
||||||
const serverRenderer = new ServerRenderer(head, config, dataHolder)
|
const serverRenderer = new ServerRenderer(head, config, dataHolder)
|
||||||
|
|
|
@ -1,85 +1,22 @@
|
||||||
import fs from 'fs'
|
|
||||||
import jsonfile from 'jsonfile'
|
|
||||||
import path from 'path'
|
|
||||||
import mongoose from 'mongoose'
|
|
||||||
|
|
||||||
export class DataHolder {
|
export class DataHolder {
|
||||||
constructor (config) {
|
constructor (storage) {
|
||||||
this.config = config
|
this.storage = storage
|
||||||
|
|
||||||
if (this.config.storage === 'file') {
|
|
||||||
this.data = {
|
|
||||||
posts: [],
|
|
||||||
other: {}
|
|
||||||
}
|
|
||||||
} else if (this.config.storage === 'mongo') {
|
|
||||||
this.Post = mongoose.model('Post', {
|
|
||||||
filename: String,
|
|
||||||
published: String,
|
|
||||||
title: String,
|
|
||||||
summary: String,
|
|
||||||
link: String,
|
|
||||||
body: String
|
|
||||||
})
|
|
||||||
|
|
||||||
this.Other = mongoose.model('Other', {
|
|
||||||
filename: String,
|
|
||||||
body: String
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getData (reqPath) {
|
|
||||||
if (this.config.storage === 'file') {
|
|
||||||
return this.getDataFromFile(reqPath)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getDataFromFile (reqPath) {
|
|
||||||
if (reqPath === '') {
|
|
||||||
return Promise.resolve(this.data)
|
|
||||||
} else if (reqPath === 'resume') {
|
|
||||||
const fileName = path.join(process.cwd(), 'content', reqPath + '.md')
|
|
||||||
return this.readFile(fileName, 'resume', 'utf8')
|
|
||||||
} else {
|
|
||||||
const fileName = path.join(process.cwd(), 'content', reqPath + '.md')
|
|
||||||
return this.readFile(fileName, 'post', 'utf8')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
readFile (fileName, type, options) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
fs.readFile(fileName, options, (err, data) => {
|
|
||||||
err ? reject(err) : resolve({
|
|
||||||
type: type,
|
|
||||||
data: data
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
readJson (dataPath) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
jsonfile.readFile(dataPath, (err, data) => {
|
|
||||||
err ? reject(err) : resolve(data)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addPost (post) {
|
addPost (post) {
|
||||||
if (this.config.storage === 'file') {
|
this.storage.addPost(post)
|
||||||
delete post.body
|
|
||||||
this.data.posts.push(post)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addOther (filename, data) {
|
addOther (filename, data) {
|
||||||
this.data.other[filename] = data
|
this.storage.addOther(filename, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteFile (filepath) {
|
deleteFile (filepath) {
|
||||||
this.data.posts = this.data.posts.filter((post) =>
|
this.storage.deleteFile(filepath)
|
||||||
post.filename !== filepath
|
}
|
||||||
)
|
|
||||||
|
getData (reqPath) {
|
||||||
|
return this.storage.getData(reqPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ export class Scanner {
|
||||||
})
|
})
|
||||||
.on('change', filepath => {
|
.on('change', filepath => {
|
||||||
console.log(`[Scanner] File ${filepath} has been changed`)
|
console.log(`[Scanner] File ${filepath} has been changed`)
|
||||||
this.updateFile(filepath)
|
this.addFile(filepath)
|
||||||
})
|
})
|
||||||
.on('unlink', filepath => {
|
.on('unlink', filepath => {
|
||||||
console.log(`[Scanner] File ${filepath} has been removed`)
|
console.log(`[Scanner] File ${filepath} has been removed`)
|
||||||
|
@ -42,11 +42,6 @@ export class Scanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateFile (filepath) {
|
|
||||||
this.deleteFile(filepath)
|
|
||||||
this.addFile(filepath)
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteFile (filepath) {
|
deleteFile (filepath) {
|
||||||
this.dataHolder.deleteFile(filepath)
|
this.dataHolder.deleteFile(filepath)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
import fs from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
export class FileStorage {
|
||||||
|
|
||||||
|
constructor () {
|
||||||
|
this.data = {
|
||||||
|
posts: [],
|
||||||
|
other: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addPost (post) {
|
||||||
|
delete post.body
|
||||||
|
const postIndex = this._findWithAttr(this.data.posts, 'filename', post.filename)
|
||||||
|
|
||||||
|
if (postIndex === -1) {
|
||||||
|
this.data.posts.push(post)
|
||||||
|
} else {
|
||||||
|
this.data.posts[postIndex] = post
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addOther (filename, data) {
|
||||||
|
this.data.other[filename] = data
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteFile (filepath) {
|
||||||
|
this.data.posts = this.data.posts.filter((post) =>
|
||||||
|
post.filename !== filepath
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
getData (reqPath) {
|
||||||
|
return this._getDataFromFile(reqPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
_getDataFromFile (reqPath) {
|
||||||
|
if (reqPath === '') {
|
||||||
|
return Promise.resolve(this.data)
|
||||||
|
} else if (reqPath === 'resume') {
|
||||||
|
const fileName = path.join(process.cwd(), 'content', reqPath + '.md')
|
||||||
|
return this._readFile(fileName, 'resume', 'utf8')
|
||||||
|
} else {
|
||||||
|
const fileName = path.join(process.cwd(), 'content', reqPath + '.md')
|
||||||
|
return this._readFile(fileName, 'post', 'utf8')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_readFile (fileName, type, options) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
fs.readFile(fileName, options, (err, data) => {
|
||||||
|
err ? reject(err) : resolve({
|
||||||
|
type: type,
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_findWithAttr (array, attr, value) {
|
||||||
|
for (let i = 0; i < array.length; i += 1) {
|
||||||
|
if (array[i][attr] === value) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
import mongoose from 'mongoose'
|
||||||
|
|
||||||
|
export class MongoStorage {
|
||||||
|
constructor () {
|
||||||
|
this.Post = mongoose.model('Post', {
|
||||||
|
filename: String,
|
||||||
|
published: String,
|
||||||
|
title: String,
|
||||||
|
summary: String,
|
||||||
|
link: String,
|
||||||
|
body: String
|
||||||
|
})
|
||||||
|
|
||||||
|
this.Other = mongoose.model('Other', {
|
||||||
|
filename: String,
|
||||||
|
body: String
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
addPost (post) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
addOther (filename, data) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteFile (filepath) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getData (reqPath) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue