Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,17 @@ $ NODE_ENV=production npm start
- GET : Read (Content-Type -> application/json)
- DELETE : Delete (Content-Type -> application/json)
- POST : Create , Read (Content-Type -> application/json, BODY - raw data)
- PUT : Create , Update (Content-Type -> application/json, BODY - raw data)
- PUT : Update, Create (Content-Type -> application/json, BODY - raw data)
![Image](./public/readmeImage/example_post_body.png)
- if you add postfix '.json' to api url, the 'Content-Type' will be changed to 'application/json'

## Read API PATH
```
http://localhost:3000/test --> find `test.json` file
http://localhost:3000/test.json --> find `test.json` file
http://localhost:3000/test/ --> find a file list in the `test` directory
```

## #set env....
```
$ export NODE_ENV=development
Expand Down
97 changes: 76 additions & 21 deletions routes/jsonFile.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,17 @@ var path = require('path');
var url = require('url');
var ff = require('../routes/findFile');

// get
// get : read
router.get('/', function(req, res, next) {
var resultData;
var reqPath = getFilePathByRequest(req);
var filePath = addExtNameJson(reqPath);

try {
if (fs.existsSync(reqPath) && fs.lstatSync(reqPath).isDirectory()) {
if (isExistFile(filePath)) {
resultData = readData(filePath);
} else if (isDirectory(reqPath)) {
resultData = ff.hierarchyFiles(ff.findFiles(reqPath));
} else if (fs.existsSync(filePath) && fs.lstatSync(filePath).isFile()) {
var fileString = fs.readFileSync(filePath, 'utf8');
resultData = JSON.parse(fileString);
} else {
next();
}
Expand All @@ -31,21 +30,19 @@ router.get('/', function(req, res, next) {
res.json(resultData);
});

// post
// post : create | read
router.post('/', function(req, res, next) {
var resultData;
var json = req.body;
var filePath = getFilePathByRequest(req);
filePath = addExtNameJson(filePath);

try {
if (fs.existsSync(filePath) && fs.lstatSync(filePath).isFile()) {
var fileString = fs.readFileSync(filePath, 'utf8');
resultData = JSON.parse(fileString);
if (isExistFile(filePath)) {
resultData = readData(filePath);
} else {
mkdirp(filePath);
fs.writeFileSync(filePath, JSON.stringify(json), 'utf8');
resultData = json;
resultData = createData(filePath, json);
res.status(201);
}
} catch(e) {
// console.log(e);
Expand All @@ -54,49 +51,61 @@ router.post('/', function(req, res, next) {
err.status = 500;
next(err);
}

res.json(resultData);
});

// put
// put : update | create
router.put('/', function(req, res, next) {
var resultData;
var json = req.body;
var filePath = getFilePathByRequest(req);
filePath = addExtNameJson(filePath);

try {
mkdirp(filePath);
fs.writeFileSync(filePath, JSON.stringify(json), 'utf8');
resultData = json;
if (isExistFile(filePath)) {
resultData = updateData(filePath, json);
} else {
resultData = createData(filePath, json);
res.status(201);
}
} catch(e) {
// console.log(e);
var errorMessage = 'Fail Put';
var err = new Error(errorMessage);
err.status = 500;
next(err);
}

res.json(resultData);
});

// delete
// delete : delete
router.delete('/', function(req, res, next) {
var resultData;
var filePath = getFilePathByRequest(req);
filePath = addExtNameJson(filePath);

try {
fs.unlinkSync(filePath);
resultData = 'Success Delete';
if (isExistFile(filePath)) {
resultData = deleteData(filePath);
} else {
res.status(204);
}
} catch(e) {
// console.log(e);
var errorMessage = 'Fail Delete';
var err = new Error(errorMessage);
err.status = 500;
next(err);
}

res.json(resultData);
});


// private function

function addExtNameJson(urlPath) {
var resultPath;
var extname = path.extname(urlPath);
Expand All @@ -108,7 +117,7 @@ function addExtNameJson(urlPath) {
resultPath = urlPath.replace(extname, ff.extJson);
}
} else {
resultPath = urlPath + ff.extJson;
resultPath = urlPath.endsWith(ff.extJson) ? urlPath : urlPath + ff.extJson;
}

return resultPath;
Expand All @@ -123,10 +132,56 @@ function getFilePathByRequest(req) {
function mkdirp(filePath) {
var dirname = path.dirname(filePath);
if (fs.existsSync(dirname)) {
return true;
return false;
}

mkdirp(dirname);
fs.mkdirSync(dirname);

return true;
}

function isDirectory(reqPath) {
return fs.existsSync(reqPath) && fs.lstatSync(reqPath).isDirectory();
}

function isExistFile(filePath) {
return fs.existsSync(filePath) && fs.lstatSync(filePath).isFile();
}


// function : create, read, update, delete

function createData(filePath, json) {
let resultData;

mkdirp(filePath);
fs.writeFileSync(filePath, JSON.stringify(json), 'utf8');
resultData = json;

return resultData;
}

function readData(filePath) {
let resultData;

let fileString = fs.readFileSync(filePath, 'utf8');
resultData = JSON.parse(fileString);

return resultData;
}

function updateData(filePath, json) {
return createData(filePath, json);
}

function deleteData(filePath) {
let resultData;

fs.unlinkSync(filePath);
resultData = 'Success Delete';

return resultData;
}

module.exports = router;
4 changes: 2 additions & 2 deletions views/index.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -192,11 +192,11 @@
function requestXhttp(url, method, data, successCallback, errorCallback) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
if (this.readyState == 4 && (200 <= this.status && this.status < 300)) {
if (successCallback) {
successCallback(this.responseText);
}
} else if (this.readyState == 4 && this.status != 200) {
} else if (this.readyState == 4 && !(200 <= this.status && this.status < 300)) {
if (errorCallback) {
errorCallback(this.responseText);
} else {
Expand Down