Skip to content

Commit 149d1e2

Browse files
committed
v:1.0
0 parents  commit 149d1e2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+21485
-0
lines changed

New Text Document.txt

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
@echo off
2+
3+
echo Creating Flask App Folder...
4+
5+
mkdir backend
6+
cd backend
7+
8+
echo Creating App Folder...
9+
mkdir app
10+
cd app
11+
12+
echo Creating __init__.py...
13+
echo > __init__.py
14+
15+
echo Creating models.py...
16+
echo > models.py
17+
18+
echo Creating routes.py...
19+
echo > routes.py
20+
21+
echo Creating auth.py...
22+
echo > auth.py
23+
24+
echo Creating utils.py...
25+
echo > utils.py
26+
27+
cd ..
28+
29+
echo Creating config.py...
30+
echo > config.py
31+
32+
echo Creating requirements.txt...
33+
echo > requirements.txt
34+
35+
echo Creating run.py...
36+
echo > run.py
37+
38+
echo Flask App Folder Structure created successfully!

README.md

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Portal
2+
3+
Portal to add and review articles of varrious authors.
4+
5+
## Table of Contents
6+
7+
- [Overview](#overview)
8+
- [Features](#features)
9+
- [Installation](#installation)
10+
- [Usage](#usage)
11+
- [Contributing](#contributing)
12+
- [License](#license)
13+
14+
## Overview
15+
16+
Provide a brief overview of your project here, explaining its purpose and main features. You can also include any relevant screenshots or GIFs to showcase the application.
17+
18+
## Features
19+
20+
Main features of your application:
21+
- User registration and login
22+
- Writing articles
23+
- Categorizing articles
24+
- Adding images to articles
25+
26+
## Prerequisites
27+
28+
Before getting started, make sure you have the following prerequisites installed:
29+
30+
- Python 3.x: You can download Python from the official website: https://www.python.org/downloads/
31+
- Node.js and npm: You can download Node.js from the official website: https://nodejs.org/
32+
- MongoDB You can download mongoDB from the official website: https://www.mongodb.com/try/download/community
33+
34+
## Installation
35+
36+
Instructions on how to install and set up the project locally. First of all make sure mongoDB is installed and running properly on your local machine.
37+
38+
1. Clone the repository:<br>
39+
```
40+
https://github.com/alankaralankar/portal.git
41+
```
42+
2. Install dependencies for the Flask backend:<br>
43+
```
44+
cd backend
45+
pip install -r requirements.txt
46+
```
47+
3. Start the Flask backend:
48+
```
49+
flask run
50+
```
51+
3. Install dependencies for the React frontend:
52+
```
53+
cd ../frontend
54+
npm install --force
55+
```
56+
5. Start the React frontend:
57+
```
58+
npm start
59+
```
60+
61+
Alternatively You can download and install docker from the official website https://docs.docker.com/engine/install/ for your respective OS. Then Type
62+
```
63+
docker-compose up
64+
```
65+
For setting up the whole project in a single command.
66+
67+

backend/.gitignore

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Byte-compiled / optimized / DLL files
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
6+
# Environment variables
7+
.env
8+
9+
# IDE and editor files
10+
.vscode/
11+
.idea/
12+
13+
# Log files
14+
*.log
15+
16+
# Dependency directories
17+
venv/
18+
env/
19+
myenv/
20+
uploads/
21+
myvenv/

backend/app/__init__.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from flask import Flask
2+
from flask_mongoengine import MongoEngine
3+
from flask_bcrypt import Bcrypt
4+
from flask_cors import CORS
5+
6+
7+
# Initialize Flask app
8+
app = Flask(__name__)
9+
CORS(app,supports_credentials=True)
10+
11+
12+
app.config['SECRET_KEY'] = 'ukhvfqweyur7qefisf78w3fgqwif7'
13+
app.config["SESSION_COOKIE_SAMESITE"] = "None"
14+
app.config["SESSION_COOKIE_SECURE"] = True
15+
# Configure MongoDB
16+
# app.config['MONGODB_SETTINGS'] = {
17+
# 'db': 'blogNetwork',
18+
# 'host': 'mongodb://host.docker.internal:27017/mydb'
19+
# }
20+
app.config['MONGODB_SETTINGS'] = {
21+
'db': 'blogNetwork',
22+
'host': 'mongodb://localhost:27017/mydb'
23+
}
24+
25+
26+
db = MongoEngine(app)
27+
28+
# Initialize Bcrypt for password hashing
29+
bcrypt = Bcrypt(app)
30+
31+
# Import and register blueprints
32+
from app.routes.auth import auth_bp
33+
from app.routes.main import main_bp
34+
35+
app.register_blueprint(auth_bp)
36+
app.register_blueprint(main_bp)
37+

backend/app/models.py

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
from app import db, bcrypt
2+
from datetime import datetime
3+
4+
# Define data models using MongoEngine
5+
6+
7+
class User(db.Document):
8+
name = db.StringField(required=True)
9+
email = db.StringField(required=True)
10+
password = db.StringField(required=True)
11+
image = db.StringField(required=False)
12+
def to_dict(self):
13+
return {
14+
'id': str(self.id),
15+
'name': self.name,
16+
'email': self.email,
17+
'image': self.image
18+
}
19+
20+
class Post(db.Document):
21+
title = db.StringField(required=True)
22+
content = db.StringField(required=True)
23+
image = db.StringField(required=False)
24+
category = db.StringField(required=True)
25+
created_at = db.DateTimeField(default=datetime.utcnow)
26+
updated_at = db.DateTimeField(default=datetime.utcnow)
27+
uid = db.StringField(required=True)
28+
29+
def to_dict(self):
30+
return {
31+
'id': str(self.id),
32+
'title': self.title,
33+
'content': self.content,
34+
'category': self.category,
35+
'image': self.image,
36+
'created_at': self.created_at,
37+
'updated_at': self.updated_at,
38+
'uid':self.uid
39+
}
40+
41+
class Comment(db.Document):
42+
content = db.StringField(required=True)
43+
created_at = db.DateTimeField(default=datetime.utcnow)
44+
updated_at = db.DateTimeField(default=datetime.utcnow)
45+
uid = db.StringField(required=True)
46+
postId = db.StringField(required=True)
47+
48+
def to_dict(self):
49+
return {
50+
'id': str(self.id),
51+
'content': self.content,
52+
'created_at': self.created_at,
53+
'updated_at': self.updated_at,
54+
'uid':self.uid,
55+
'postId':self.postId
56+
}
57+
58+
class Microstructure(db.Document):
59+
name = db.StringField(required=True)
60+
description = db.StringField(required=True)
61+
category = db.StringField(required=True)
62+
image = db.StringField(required=False)
63+
composition = db.ListField(required=True)
64+
created_at = db.DateTimeField(default=datetime.utcnow)
65+
updated_at = db.DateTimeField(default=datetime.utcnow)
66+
uid = db.StringField(required=True)
67+
68+
def to_dict(self):
69+
return {
70+
'id': str(self.id),
71+
'name': self.name,
72+
'description': self.description,
73+
'category': self.category,
74+
'composition': self.composition,
75+
'image': self.image,
76+
'created_at': self.created_at,
77+
'updated_at': self.updated_at,
78+
'uid':self.uid
79+
}
80+
81+
class Element:
82+
def __init__(self, name, percentage):
83+
self.name = name
84+
self.percentage = percentage
85+
86+
87+

backend/app/routes/__init__.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from flask import Blueprint
2+
3+
# Create a Blueprint for auth routes
4+
auth_bp = Blueprint('auth', __name__)
5+
6+
# Import auth routes
7+
from app.routes.auth import login, register
8+
9+
# Create a Blueprint for main routes
10+
main_bp = Blueprint('main', __name__)
11+
12+
# Import main routes
13+
from app.routes.main import home

backend/app/routes/auth.py

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
from flask import request, jsonify, Blueprint, session, make_response
2+
from app import app, bcrypt
3+
from app.models import User, bcrypt
4+
from werkzeug.utils import secure_filename
5+
import os
6+
import uuid
7+
import jwt
8+
import datetime
9+
10+
from bcrypt import checkpw, hashpw, gensalt
11+
12+
# Create a Blueprint for auth routes
13+
auth_bp = Blueprint('auth', __name__)
14+
15+
# Register route
16+
@auth_bp.route('/register', methods=['POST'])
17+
def register():
18+
if request.method == 'POST':
19+
20+
name = request.form.get('name')
21+
email= request.form.get('email')
22+
password = request.form.get('password')
23+
image_file = request.files.get('image')
24+
25+
if not name or not email or not password:
26+
return {'error':'Invalid JSON data'}, 400 # Return error response for invalid JSON
27+
28+
# Check if email already exists in MongoDB
29+
existing_user = User.objects(email=email).first()
30+
if existing_user:
31+
return {"error":'Email already registered. Please login or use a different email.'},409
32+
33+
if image_file:
34+
filename = secure_filename(str(uuid.uuid4()) + '.jpg')
35+
image_path = os.path.join(app.config['UPLOAD_FOLDER'],filename)
36+
with open(image_path, 'wb') as f:
37+
f.write(image_file.read())
38+
image_url = filename
39+
else:
40+
image_url = None
41+
42+
# Store user in MongoDB
43+
user = User(name=name, email=email, image=image_url, password= bcrypt.generate_password_hash(password).decode('utf-8'))
44+
user.save()
45+
return {"message":'Registration successful. Please login.'}
46+
47+
# Login route
48+
@auth_bp.route('/login', methods=['POST'])
49+
def login():
50+
# Get username and password from request data
51+
email = request.json['email']
52+
password = request.json['password']
53+
54+
# Find the User in the database
55+
existing_user = User.objects(email=email).first()
56+
if existing_user and checkpw(password.encode('utf-8'), existing_user['password'].encode('utf-8')):
57+
status_code = 200
58+
token = jwt.encode({'name': existing_user['name'],'email': email, 'image': existing_user['image'], 'uid': str(existing_user['id']),'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)}, app.config['SECRET_KEY'] , algorithm='HS256')
59+
session['token'] = token
60+
response = {'message': 'Login successful', 'token':token}
61+
response = make_response(response)
62+
response.set_cookie('access_token',token)
63+
else:
64+
response = {'error': 'Invalid username or password'}
65+
status_code = 401
66+
67+
return response, status_code
68+
69+
# Protected route
70+
@auth_bp.route('/protected')
71+
def protected():
72+
# Verify JWT token
73+
token = request.headers.get('token')
74+
# print(token)
75+
# print(session.get('token'))
76+
if session.get('token') is None:
77+
return {'error':'Please Login to continue'},401
78+
if token!=session['token']:
79+
return {'error': 'Invalid token'},401
80+
if not token:
81+
return {'error': 'No token provided'},401
82+
83+
try:
84+
# Decode JWT token
85+
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
86+
email = payload['email']
87+
name = payload['name']
88+
uid = payload['uid']
89+
image = payload['image']
90+
return {'message': f'Welcome, {name}', 'email':email, 'name':name, 'uid': uid, 'image': image}
91+
except jwt.ExpiredSignatureError:
92+
return {'error': 'Token has expired'},401
93+
except jwt.InvalidTokenError:
94+
return {'error': 'Invalid token'},401
95+
96+
@auth_bp.route('/users/<user_id>')
97+
def getUserById(user_id):
98+
user =User.objects(id=user_id).first()
99+
if not user:
100+
return jsonify({'error': 'user not found'}), 404
101+
return jsonify(user.to_dict()), 200
102+
103+
@auth_bp.route('/users')
104+
def getAllUsers():
105+
users = User.objects()
106+
return jsonify([user.to_dict() for user in users]), 200
107+
108+
109+
# Logout route
110+
@app.route('/logout')
111+
def logout():
112+
# Clear token from session
113+
session.pop('token', None)
114+
return {"message":'Logged out successfully.'}
115+

0 commit comments

Comments
 (0)