Oluşturuldu

This commit is contained in:
batuhancoskun 2025-07-24 08:10:35 +03:00
commit 673cceef53
31 changed files with 2121 additions and 0 deletions

5
.env Normal file
View File

@ -0,0 +1,5 @@
DB_NAME=sina
DB_USER=sina
DB_PASS=sina
DB_HOST=127.0.0.1
DB_DIAL=mysql

6
api/apis.js Normal file
View File

@ -0,0 +1,6 @@
const express = require("express");
const app = express();
app.use("/v1", require("./v1/v1"));
module.exports = app;

8
api/v1/authors/app.js Normal file
View File

@ -0,0 +1,8 @@
const express = require("express");
const app = express();
const db_authors = require("./db");
app.use("/get", require("./routes/get"));
app.use("/post", require("./routes/post"));
module.exports = app;

15
api/v1/authors/db.js Normal file
View File

@ -0,0 +1,15 @@
const { DataTypes } = require("sequelize");
const database = require("../../../database/db");
module.exports = database.define("authors", {
name: {
type: DataTypes.CHAR(100),
unique: false,
allowNull: false
},
biography: {
type: DataTypes.TEXT,
unique: false,
allowNull: false
}
});

View File

@ -0,0 +1,53 @@
exports.p_create = async function(name, biography){
const data = {
name: {
value: name,
min: 3,
max: 50,
success: false
},
biography: {
value: biography,
min: 10,
max: 2500,
success: false
}
};
const returnData = {
status: null,
success: null
};
const keys = Object.keys(data);
keys.forEach(key => {
const obj = data[key];
const value_len = obj.value.length
if(value_len > obj.min && value_len < obj.max){
obj.success = true
};
});
keys.forEach(key => {
try {
const success = data[key].success;
if(returnData.success !== false && success !== true){
returnData.success = false;
}else if (returnData.success !== false && success !== false){
returnData.success = true;
};
} catch (error) {
returnData.success = false;
}
});
if(returnData.success === false || returnData.success === true){
returnData.status = 200;
}else{
returnData.status = 404;
};
return returnData;
};

View File

@ -0,0 +1,8 @@
const db = require("../db");
exports.p_create = async function(name, biography){
return await db.create({
name: name,
biography: biography
});
};

View File

@ -0,0 +1,48 @@
const express = require("express");
const db_authors = require("../db");
const db_books = require("../../books/db");
const { Op } = require("sequelize");
const app = express();
app.get("/all", async (req, res) => {
res.json(await db_authors.findAll({
include: {
model: db_books,
as: "book"
}
}));
});
app.get("/top20", async (req, res) => {
res.json(await db_authors.findAll({
include: {
model: db_books,
as: "book"
},
limit: 20,
order: [['createdAt', 'DESC']]
}));
});
app.get("/search", async (req, res) => {
res.json(await db_authors.findAll({
where: {
name: req.query.q
},
limit: 20
}));
});
app.get("/:author_id", async (req, res) => {
res.json(await db_authors.findOne({
where: {
id: req.params.author_id
},
include: {
model: db_books,
as: "book"
}
}));
});
module.exports = app;

View File

@ -0,0 +1,21 @@
const express = require("express");
const checks = require("../middlewares/checks");
const process = require("../middlewares/process");
const app = express();
app.post("/create", async (req, res) => {
if(req.body.name && req.body.biography){
const check = await checks.p_create(req.body.name, req.body.biography);
if(check.status === 200 && check.success === true){
await process.p_create(req.body.name, req.body.biography);
};
res.json(check);
}else{
res.json({
Status: 200,
Success: false
});
};
});
module.exports = app;

8
api/v1/books/app.js Normal file
View File

@ -0,0 +1,8 @@
const express = require("express");
const app = express();
const db_books = require("./db");
app.use("/get", require("./routes/get"));
app.use("/post", require("./routes/post"));
module.exports = app;

15
api/v1/books/db.js Normal file
View File

@ -0,0 +1,15 @@
const { DataTypes } = require("sequelize");
const database = require("../../../database/db");
module.exports = database.define("books", {
title: {
type: DataTypes.CHAR(100),
unique: false,
allowNull: false
},
description: {
type: DataTypes.TEXT,
unique: false,
allowNull: false
}
});

View File

@ -0,0 +1,76 @@
const db = require("../db");
const author_db = require("../../authors/db");
exports.p_create = async function(title, description, author_id){
const data = {
title: {
value: title,
min: 3,
max: 100,
type: "length",
success: false
},
description: {
value: description,
min: 10,
max: 2500,
type: "length",
success: false
},
author_id: {
value: author_id,
func: async (value) => {
return await author_db.findOne({
where: {
id: value
}
}).then(res => {
return (res) ? true : false;
});
},
type: "id_author",
success: false
}
};
const returnData = {
status: null,
success: null
};
const keys = Object.keys(data);
keys.forEach(async key => {
const obj = data[key];
if(obj.type === "length"){
const value_len = obj.value.length;
if(value_len > obj.min && value_len < obj.max){
obj.success = true
};
};
});
data.author_id.success = await data.author_id.func(data.author_id.value);
keys.forEach(key => {
try {
const success = data[key].success;
if(returnData.success !== false && success !== true){
returnData.success = false;
}else if (returnData.success !== false && success !== false){
returnData.success = true;
};
} catch (error) {
returnData.success = false;
}
});
if(returnData.success === false || returnData.success === true){
returnData.status = 200;
}else{
returnData.status = 404;
};
return returnData;
};

View File

@ -0,0 +1,20 @@
const db_books = require("../db");
const db_authors = require("../../authors/db");
exports.p_create = async function(title, description, author_id){
const author_result = await db_authors.findOne({
where: {
id: author_id
}
});
if(author_result){
const book_result = await db_books.create({
title: title,
description: description
});
return await author_result.setBook(book_result);
};
return false;
};

View File

@ -0,0 +1,68 @@
const express = require("express");
const db_books = require("../db");
const db_authors = require("../../authors/db");
const db_quotes = require("../../quotes/db");
const { Op } = require("sequelize");
const app = express();
app.get("/all", async (req, res) => {
res.json(await db_books.findAll({
include: {
model: db_authors,
as: "author",
attributes: ["name"]
}
}));
});
app.get("/top20", async (req, res) => {
res.json(await db_books.findAll({
include: {
model: db_authors,
as: "author",
attributes: ["name"]
},
limit: 20,
order: [['createdAt', 'DESC']]
}));
});
app.get("/search", async (req, res) => {
res.json(await db_books.findAll({
where: {
title: {
[Op.substring]: req.query.q
}
},
include: {
model: db_authors,
as: "author",
attributes: ["name"]
},
limit: 20,
order: [["createdAt", "DESC"]]
}));
});
app.get("/:book_id", async (req, res) => {
res.json({
book: await db_books.findOne({
where: {
id: req.params.book_id
},
include: {
model: db_authors,
as: "author",
attributes: ["name"]
}
}),
quotes: await db_quotes.findAll({
where: {
bookId: req.params.book_id
},
order: [["createdAt", "DESC"]]
})
});
});
module.exports = app;

View File

@ -0,0 +1,21 @@
const express = require("express");
const checks = require("../middlewares/checks");
const process = require("../middlewares/process");
const app = express();
app.post("/create", async (req, res) => {
if(req.body.title && req.body.description && req.body.author_id){
const check = await checks.p_create(req.body.title, req.body.description, req.body.author_id);
if(check.status === 200 && check.success === true){
await process.p_create(req.body.title, req.body.description, req.body.author_id);
};
res.json(check);
}else{
res.json({
Status: 200,
Success: false
});
};
});
module.exports = app;

15
api/v1/logins/db.js Normal file
View File

@ -0,0 +1,15 @@
const { DataTypes } = require("sequelize");
const database = require("../../../database/db");
module.exports = database.define("logins", {
email: {
type: DataTypes.CHAR(255),
unique: true,
allowNull: false
},
password: {
type: DataTypes.CHAR(255),
unique: false,
allowNull: false
}
});

7
api/v1/quotes/app.js Normal file
View File

@ -0,0 +1,7 @@
const express = require("express");
const app = express();
app.use("/get", require("./routes/get"));
app.use("/post", require("./routes/post"));
module.exports = app;

15
api/v1/quotes/db.js Normal file
View File

@ -0,0 +1,15 @@
const { DataTypes } = require("sequelize");
const database = require("../../../database/db");
module.exports = database.define("quotes", {
title: {
type: DataTypes.CHAR(100),
unique: false,
allowNull: false
},
text: {
type: DataTypes.TEXT,
unique: false,
allowNull: false
}
});

View File

@ -0,0 +1,75 @@
const db_books = require("../../books/db");
exports.p_create = async function(title, text, book_id){
const data = {
title: {
value: title,
min: 3,
max: 100,
type: "length",
success: false
},
text: {
value: text,
min: 10,
max: 2500,
type: "length",
success: false
},
book_id: {
value: book_id,
func: async (value) => {
return await db_books.findOne({
where: {
id: value
}
}).then(res => {
return (res) ? true : false;
});
},
type: "book_id",
success: false
}
};
const returnData = {
status: null,
success: null
};
const keys = Object.keys(data);
keys.forEach(async key => {
const obj = data[key];
if(obj.type === "length"){
const value_len = obj.value.length;
if(value_len > obj.min && value_len < obj.max){
obj.success = true
};
};
});
data.book_id.success = await data.book_id.func(data.book_id.value);
keys.forEach(key => {
try {
const success = data[key].success;
if(returnData.success !== false && success !== true){
returnData.success = false;
}else if (returnData.success !== false && success !== false){
returnData.success = true;
};
} catch (error) {
returnData.success = false;
}
});
if(returnData.success === false || returnData.success === true){
returnData.status = 200;
}else{
returnData.status = 404;
};
return returnData;
}

View File

@ -0,0 +1,25 @@
const db_books = require("../../books/db");
const db_authors = require("../../authors/db");
const db_quotes = require("../db");
exports.p_create = async function(title, text, book_id, user_id){
const book_result = await db_books.findOne({
where: {
id: book_id
}
});
const user_result = true;
if(book_result && user_result){
const quotes_result = await db_quotes.create({
title: title,
text: text,
bookId: book_id,
userId: user_id
});
return quotes_result;
};
return false;
};

View File

@ -0,0 +1,24 @@
const express = require("express");
const app = express();
const db_quotes = require("../db");
const { Op } = require("sequelize");
app.get("/search", async (req, res) => {
res.json(await db_quotes.findAll({
where: {
bookId: req.query.book_id,
[Op.or]: {
title: {
[Op.substring]: req.query.q
},
text: {
[Op.substring]: req.query.q
},
id: req.query.q
}
},
order: [["createdAt", "DESC"]]
}));
});
module.exports = app;

View File

@ -0,0 +1,16 @@
const express = require("express");
const process = require("../middlewares/process");
const checks = require("../middlewares/checks");
const app = express();
app.post("/create", async (req, res) => {
const check_result = await checks.p_create(req.body.title, req.body.text, req.body.book_id);
if(check_result.success === true && check_result.status === 200){
await process.p_create(req.body.title, req.body.text, req.body.book_id, 1)
res.json(check_result);
}else{
res.send(false);
};
});
module.exports = app;

7
api/v1/users/app.js Normal file
View File

@ -0,0 +1,7 @@
const express = require("express");
const app = express();
app.use("/get", require("./routes/get"));
app.use("/post", require("./routes/post"));
module.exports = app;

26
api/v1/users/db.js Normal file
View File

@ -0,0 +1,26 @@
const { DataTypes } = require("sequelize");
const database = require("../../../database/db");
module.exports = database.define("users", {
name: {
type: DataTypes.CHAR(50),
unique: false,
allowNull: false
},
surname: {
type: DataTypes.CHAR(50),
unique: false,
allowNull: false
},
username: {
type: DataTypes.CHAR(25),
unique: false,
allowNull: false
},
active: {
type: DataTypes.BOOLEAN,
unique: false,
allowNull: false,
defaultValue: true
}
});

View File

@ -0,0 +1,4 @@
const express = require("express");
const app = express();
module.exports = app;

View File

@ -0,0 +1,4 @@
const express = require("express");
const app = express();
module.exports = app;

9
api/v1/v1.js Normal file
View File

@ -0,0 +1,9 @@
const express = require("express");
const app = express();
app.use("/books", require("./books/app"));
app.use("/authors", require("./authors/app"));
app.use("/quotes", require("./quotes/app"));
app.use("/users", require("./users/app"));
module.exports = app;

16
database/db.js Normal file
View File

@ -0,0 +1,16 @@
const Sequelize = require("sequelize");
const Database = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
host: process.env.DB_HOST,
// port: DatabaseConfig.db_port,
dialect: process.env.DB_DIAL,
// storage: DatabaseConfig.db_storage
});
Database.authenticate().then(() => {
console.log('Veritabanı Bağlantısı Başarılı');
}).catch((error) => {
console.error('Veritabanı Bağlantısı Hatalı: ', error);
});
module.exports = Database;

63
database/relation.js Normal file
View File

@ -0,0 +1,63 @@
const books_db = require("../api/v1/books/db");
const authors_db = require("../api/v1/authors/db");
const quotes_db = require("../api/v1/quotes/db");
const user_db = require("../api/v1/users/db");
const login_db = require("../api/v1/logins/db");
books_db.belongsToMany(authors_db, {
through: "books_author",
as: "author",
foreignKey: "book_id"
});
authors_db.belongsToMany(books_db, {
through: "books_author",
as: "book",
foreignKey: "author_id"
});
books_db.hasMany(quotes_db, {
foreignKey: {
allowNull: false
}
});
quotes_db.belongsTo(books_db);
user_db.hasMany(quotes_db, {
foreignKey: {
allowNull: false
}
});
quotes_db.belongsTo(user_db);
user_db.hasMany(login_db, {
foreignKey: {
allowNull: false
}
});
login_db.belongsTo(user_db);
user_db.belongsToMany(quotes_db, {
through: "action_quotes",
as: "quote_quote",
foreignKey: "user_id"
});
quotes_db.belongsToMany(user_db, {
through: "action_quotes",
as: "quote_user",
foreignKey: "quote_id"
});
user_db.belongsToMany(authors_db, {
through: "follows_authors",
as: "followa_author",
foreignKey: "user_id"
});
authors_db.belongsToMany(user_db, {
through: "follows_authors",
as: "followa_user",
foreignKey: "author_id"
});

1379
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

27
package.json Normal file
View File

@ -0,0 +1,27 @@
{
"name": "sina",
"version": "1.0.0",
"description": "Sina, bir çeşit kitap veritabanıdır.",
"main": "start.js",
"scripts": {
"test": "nodemon run start.js"
},
"repository": {
"type": "git",
"url": "http://localhost:3002/Arslansah/Sina.git"
},
"keywords": [
"kitap"
],
"author": "Batuhan Coskun",
"license": "ISC",
"dependencies": {
"cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"dotenv": "^17.2.0",
"express": "^5.1.0",
"mysql2": "^3.14.2",
"nodemon": "^3.1.10",
"sequelize": "^6.37.7"
}
}

37
start.js Normal file
View File

@ -0,0 +1,37 @@
const express = require("express");
const app = express();
const cors = require("cors");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const dotenv = require("dotenv").config();
const Database = require("./database/db");
const RelationDatabase = require("./database/relation");
app.use(bodyParser.urlencoded({extended: true}));
app.use(
cors({
origin: ["http://localhost:3000"],
methods: ["GET", "POST"],
credentials: true
})
);
// app.use((req, res, next) => {
// res.header('Access-Control-Allow-Origin', '*');
// res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
// next();
// });
app.use(express.urlencoded({extended: true}));
app.use(express.json());
app.use("/api", require("./api/apis"));
(async () => {
await Database.sync({force: false});
})();
const port = 3001;
app.listen(port, () => {
console.log(port);
});