Commit d73a4fb6 authored by Kamal Thennakoon's avatar Kamal Thennakoon

implement portfolio backend

parent f888e3df
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const cors = require("cors");
const morgan = require('morgan')
require("dotenv").config();
// imports (routes)
const userRoutes=require('./routes/user-routes');
const HttpError = require("./helpers/http-error");
// db connection
mongoose
.connect(process.env.DATABASE, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
})
.then(() => {
console.log("DB connected!!!");
})
.catch((err) => {
console.log(err);
});
const app = express();
// middlewares
app.use(morgan('dev'));
app.use(bodyParser.json());
// cors error handler
if (process.env.NODE_ENV === "development") {
app.use(cors({ origin: `${process.env.CLIENT_URL}` }));
} else {
app.use(cors());
}
// routes middlewares
app.use('/api/user',userRoutes);
// Error Handler
app.use(() => {
const error = new HttpError("page not found!", 404);
throw error;
});
app.use((error, req, res, next) => {
if (res.headerSent) {
// when headers already sent, we can't output a error. because response already sent. so just return next
return next(error);
}
res.status(error.code || 500);
res.json({ error: error.message || "An unknown error occurred !!" });
return next();
});
// port
const port = process.env.PORT || 8000;
app.listen(port, () => {
console.log(`server is running on port : ${port}`);
});
const { default: axios } = require("axios");
const HttpError = require("../helpers/http-error");
const User = require("../models/user");
const getUserInfo = async (req, res, next) => {
const url = "https://api.github.com/users/dasunx";
const response = await axios.get(url);
const result = await response.data;
let repo_res;
let repo_data;
let user;
if (result) {
user = {
username: result.login,
name: result.name,
avatar_url: result.avatar_url || null,
location: result.location,
blog: result.blog || null,
bio: result.bio || null,
};
if (result.repos_url) {
repo_res = await axios.get(result.repos_url);
repo_data = await repo_res.data;
// total_stargazer_count & repo count
let total_star_received = 0;
let total_public_repos = 0;
repo_data.map((r) => {
total_star_received += r.stargazers_count;
total_public_repos++;
});
userWithRepo = { ...user, total_star_received, total_public_repos };
}
// create user obj(mongo)
const newUser = new User(user);
try {
await newUser.save(); //saving in the db
} catch (err) {
const error = new HttpError(
"Data hasn't been saved, reason: " + err,
500
);
return next(error);
}
res.status(200).json({
userInfo: userWithRepo,
msg: "success",
repos: repo_data,
});
} else {
res.status(403).json({
msg: "something went wrong",
});
}
};
const saveUserGitInfo = async (req, res, next) => {
const { name, username, avatar_url, level, score } = req.body;
console.log('retrived Data set',req.body)
try {
let user = await User.findOne({ username });
if (user) {
// update user instead
user.username=username;
user.name=name;
user.avatar_url=avatar_url,
user.level=level,
user.score=score,
user.latestUpdate=Date.now()
await user.save();
return res.status(202).json({
msg:"user has been updated successfully!"
})
} else {
const newUser = new User({
username,
name,
avatar_url,
level,
score,
latestUpdate:Date.now()
});
await newUser.save();
return res.status(201).json({
msg:"user has been created successfully!"
})
}
} catch (err) {
return res.status(500).send("Server issue: " + err);
}
};
exports.getUserInfo = getUserInfo;
exports.saveUserGitInfo = saveUserGitInfo;
const mongoose=require('mongoose');
const uniqueValidator=require('mongoose-unique-validator');
const Schema=mongoose.Schema;
const userSchema=new Schema({
username:{type:String,required:true,unique:true},
name:{type:String,required:true},
avatar_url:{type:String},
location:{type:String},
level:{type:String},
score:{type:Number},
blog:{type:String},
bio:{type:String},
total_star_received:{type:Number},
total_public_repos:{type:Number},
total_prs:{type:Number},
contributed_to:{type:Number},
git_rank:{type:String},
git_score:{type:Number},
latestUpdate:{type:Date}
})
userSchema.plugin(uniqueValidator);
module.exports = User = mongoose.model('User', userSchema);
This diff is collapsed.
{
"name": "github-data-miner-be",
"version": "1.0.0",
"description": "This will gather github user informations",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app.js",
"dev": "nodemon app.js"
},
"keywords": [
"e-learning"
],
"author": "tmKamal",
"license": "ISC",
"dependencies": {
"axios": "^0.21.1",
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-jwt": "^6.0.0",
"express-validator": "^6.9.2",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.11.15",
"mongoose-unique-validator": "^2.0.3",
"morgan": "^1.10.0",
"slugify": "^1.4.6"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}
const express=require('express');
const { getUserInfo, saveUserGitInfo } = require('../controllers/user-controller');
const router=express.Router();
router.get('/get-info',getUserInfo);
router.post('/save-git-info',saveUserGitInfo);
module.exports=router;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment