diff --git a/.env b/.env new file mode 100644 index 0000000..e1581a6 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +MONGO_URI=mongodb://localhost:27017/quiz_app +FLASK_ENV=development +DEBUG=True diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e69de29 diff --git a/app/blueprints/__init__.py b/app/blueprints/__init__.py index 85b8a28..7f5acaa 100644 --- a/app/blueprints/__init__.py +++ b/app/blueprints/__init__.py @@ -1,2 +1,3 @@ -from .auth import auth_blueprint -from .user import user_blueprint +from .default import default_blueprint +from .auth import auth_blueprint +from .user import user_blueprint diff --git a/app/blueprints/__pycache__/__init__.cpython-313.pyc b/app/blueprints/__pycache__/__init__.cpython-313.pyc index f5fb878..4d8ad6e 100644 Binary files a/app/blueprints/__pycache__/__init__.cpython-313.pyc and b/app/blueprints/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/blueprints/__pycache__/auth.cpython-313.pyc b/app/blueprints/__pycache__/auth.cpython-313.pyc index 8e3ae6f..9ef86f9 100644 Binary files a/app/blueprints/__pycache__/auth.cpython-313.pyc and b/app/blueprints/__pycache__/auth.cpython-313.pyc differ diff --git a/app/blueprints/__pycache__/default.cpython-313.pyc b/app/blueprints/__pycache__/default.cpython-313.pyc new file mode 100644 index 0000000..882f720 Binary files /dev/null and b/app/blueprints/__pycache__/default.cpython-313.pyc differ diff --git a/app/blueprints/__pycache__/user.cpython-313.pyc b/app/blueprints/__pycache__/user.cpython-313.pyc index b4ca44f..e870b81 100644 Binary files a/app/blueprints/__pycache__/user.cpython-313.pyc and b/app/blueprints/__pycache__/user.cpython-313.pyc differ diff --git a/app/blueprints/auth.py b/app/blueprints/auth.py index 246b968..e2d83fd 100644 --- a/app/blueprints/auth.py +++ b/app/blueprints/auth.py @@ -1,22 +1,22 @@ -from flask import Blueprint -from controllers import AuthController - -# Inisialisasi blueprint -auth_blueprint = Blueprint("auth", __name__) -auth_controller = AuthController() - - -# Daftarkan rute ke controller -@auth_blueprint.route("/register", methods=["POST"]) -def register(): - return auth_controller.register() - - -@auth_blueprint.route("/login", methods=["POST"]) -def login(): - return auth_controller.login() - - -@auth_blueprint.route("/logout", methods=["DELETE"]) -def logout(): - return auth_controller.logout() +from flask import Blueprint +from controllers import AuthController + +# Inisialisasi blueprint +auth_blueprint = Blueprint("auth", __name__) +auth_controller = AuthController() + + +# Daftarkan rute ke controller +@auth_blueprint.route("/register", methods=["POST"]) +def register(): + return auth_controller.register() + + +@auth_blueprint.route("/login", methods=["POST"]) +def login(): + return auth_controller.login() + + +@auth_blueprint.route("/logout", methods=["DELETE"]) +def logout(): + return auth_controller.logout() diff --git a/app/blueprints/default.py b/app/blueprints/default.py new file mode 100644 index 0000000..1d9d63e --- /dev/null +++ b/app/blueprints/default.py @@ -0,0 +1,9 @@ +from flask import Blueprint + + +default_blueprint = Blueprint("default", __name__) + + +@default_blueprint.route("/") +def home(): + return "Welcome to the Home Page!" diff --git a/app/blueprints/user.py b/app/blueprints/user.py index 000ae7e..2a5b93f 100644 --- a/app/blueprints/user.py +++ b/app/blueprints/user.py @@ -1,12 +1,12 @@ -# /blueprints/user.py - -from flask import Blueprint -from controllers import UserController - -user_blueprint = Blueprint("user", __name__) -user_controller = UserController() - - -@user_blueprint.route("/users", methods=["GET"]) -def get_users(): - return user_controller.get_users() +# /blueprints/user.py + +from flask import Blueprint +from controllers import UserController + +user_blueprint = Blueprint("user", __name__) +user_controller = UserController() + + +@user_blueprint.route("/users", methods=["GET"]) +def get_users(): + return user_controller.get_users() diff --git a/app/configs/__init__.py b/app/configs/__init__.py new file mode 100644 index 0000000..cca5d9b --- /dev/null +++ b/app/configs/__init__.py @@ -0,0 +1 @@ +from .config import Config diff --git a/app/configs/__pycache__/__init__.cpython-313.pyc b/app/configs/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..174ed44 Binary files /dev/null and b/app/configs/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/configs/__pycache__/config.cpython-313.pyc b/app/configs/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000..1359752 Binary files /dev/null and b/app/configs/__pycache__/config.cpython-313.pyc differ diff --git a/app/configs/config.py b/app/configs/config.py new file mode 100644 index 0000000..9ffc32b --- /dev/null +++ b/app/configs/config.py @@ -0,0 +1,18 @@ +import os +from dotenv import load_dotenv + +load_dotenv() # Load environment variables from .env + + +class Config: + MONGO_URI = os.getenv( + "MONGO_URI", "mongodb://localhost:27017/quiz_app" + ) # Default value if not set + + FLASK_ENV = os.getenv("FLASK_ENV", "development") # Default to development + + DEBUG = os.getenv("DEBUG", "True").lower() in [ + "true", + "1", + "t", + ] # Convert string to boolean diff --git a/app/controllers/__init__.py b/app/controllers/__init__.py index 9c5757f..2eae1aa 100644 --- a/app/controllers/__init__.py +++ b/app/controllers/__init__.py @@ -1,2 +1,2 @@ -from .auth_controller import AuthController -from .user_controller import UserController +from .auth_controller import AuthController +from .user_controller import UserController diff --git a/app/controllers/__pycache__/auth_controller.cpython-313.pyc b/app/controllers/__pycache__/auth_controller.cpython-313.pyc index 828020a..7452acf 100644 Binary files a/app/controllers/__pycache__/auth_controller.cpython-313.pyc and b/app/controllers/__pycache__/auth_controller.cpython-313.pyc differ diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py index aa61132..65c1c76 100644 --- a/app/controllers/auth_controller.py +++ b/app/controllers/auth_controller.py @@ -1,19 +1,19 @@ -from flask import jsonify, request -from services import UserService -from services import AuthService - - -class AuthController: - def __init__(self): - self.user_service = UserService() - self.auth_service = AuthService() - - def login(self): - data = request.get_json() - users = self.auth_service.login(data) - response = { - "status": True, - "message": "success retrive data", - "data": users, - } - return jsonify(response) +from flask import jsonify, request +from services import UserService +from services import AuthService + + +class AuthController: + def __init__(self): + self.user_service = UserService() + self.auth_service = AuthService() + + def login(self): + data = request.get_json() + users = self.auth_service.login(data) + response = { + "status": True, + "message": "success retrive data", + "data": users, + } + return jsonify(response) diff --git a/app/controllers/lstm_controller.py b/app/controllers/lstm_controller.py index 09422eb..6493dc7 100644 --- a/app/controllers/lstm_controller.py +++ b/app/controllers/lstm_controller.py @@ -1,17 +1,17 @@ - - -# # Sample Data Preparation -# input_dim = 3 # Example input dimension -# hidden_dim = 5 # Example hidden dimension -# num_samples = 1000 -# sequence_length = 10 - -# # Generate dummy data for training -# X = np.random.randn(num_samples, input_dim, 1) # Shape (num_samples, input_dim, 1) -# y = np.random.randn( -# num_samples, hidden_dim, 1 -# ) # Shape (num_samples, hidden_dim, 1) - -# # Initialize and train the LSTM -# lstm = LSTM(input_dim, hidden_dim) + + +# # Sample Data Preparation +# input_dim = 3 # Example input dimension +# hidden_dim = 5 # Example hidden dimension +# num_samples = 1000 +# sequence_length = 10 + +# # Generate dummy data for training +# X = np.random.randn(num_samples, input_dim, 1) # Shape (num_samples, input_dim, 1) +# y = np.random.randn( +# num_samples, hidden_dim, 1 +# ) # Shape (num_samples, hidden_dim, 1) + +# # Initialize and train the LSTM +# lstm = LSTM(input_dim, hidden_dim) # lstm.train(X, y, num_epochs=10, learning_rate=0.01) \ No newline at end of file diff --git a/app/controllers/user_controller.py b/app/controllers/user_controller.py index 350b29e..cd1935d 100644 --- a/app/controllers/user_controller.py +++ b/app/controllers/user_controller.py @@ -1,12 +1,12 @@ -# /controllers/user_controller.py -from flask import jsonify -from services import UserService - - -class UserController: - def __init__(self): - self.user_service = UserService() - - def get_users(self): - users = self.user_service.get_all_users() - return jsonify(users) +# /controllers/user_controller.py +from flask import jsonify +from services import UserService + + +class UserController: + def __init__(self): + self.user_service = UserService() + + def get_users(self): + users = self.user_service.get_all_users() + return jsonify(users) diff --git a/app/database/__init__.py b/app/database/__init__.py new file mode 100644 index 0000000..bf18d99 --- /dev/null +++ b/app/database/__init__.py @@ -0,0 +1 @@ +from .db import init_db diff --git a/app/database/__pycache__/__init__.cpython-313.pyc b/app/database/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..e78f65b Binary files /dev/null and b/app/database/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/database/__pycache__/db.cpython-313.pyc b/app/database/__pycache__/db.cpython-313.pyc new file mode 100644 index 0000000..116d94b Binary files /dev/null and b/app/database/__pycache__/db.cpython-313.pyc differ diff --git a/app/database/db.py b/app/database/db.py new file mode 100644 index 0000000..4f88ef3 --- /dev/null +++ b/app/database/db.py @@ -0,0 +1,11 @@ +from flask_pymongo import PyMongo +from flask import Flask +from configs import Config + +mongo = PyMongo() + + +def init_db(app: Flask): + app.config["MONGO_URI"] = Config.MONGO_URI + print(Config.MONGO_URI) + mongo.init_app(app) diff --git a/app/main.py b/app/main.py index 39a4273..dce2756 100644 --- a/app/main.py +++ b/app/main.py @@ -1,10 +1,21 @@ -from flask import Flask -from blueprints import auth_blueprint, user_blueprint - -app = Flask(__name__) - -app.register_blueprint(auth_blueprint, url_prefix="/api") -app.register_blueprint(user_blueprint, url_prefix="/api") - -if __name__ == "__main__": - app.run(debug=True) +from flask import Flask +from blueprints import auth_blueprint, user_blueprint, default_blueprint +from database import init_db +from configs import Config # Import the config class + +app = Flask(__name__) + +# Apply configurations environtment +app.config["FLASK_ENV"] = Config.FLASK_ENV +app.config["DEBUG"] = Config.DEBUG + +# Initialize database +init_db(app) + +# Register blueprints +app.register_blueprint(default_blueprint) +app.register_blueprint(auth_blueprint, url_prefix="/api") +app.register_blueprint(user_blueprint, url_prefix="/api") + +if __name__ == "__main__": + app.run(debug=Config.DEBUG) diff --git a/app/repositories/__init__.py b/app/repositories/__init__.py index 73ba011..1be638a 100644 --- a/app/repositories/__init__.py +++ b/app/repositories/__init__.py @@ -1 +1 @@ -from .user_repository import UserRepository +from .user_repository import UserRepository diff --git a/app/repositories/__pycache__/user_repository.cpython-313.pyc b/app/repositories/__pycache__/user_repository.cpython-313.pyc index 55836a8..0ac12ec 100644 Binary files a/app/repositories/__pycache__/user_repository.cpython-313.pyc and b/app/repositories/__pycache__/user_repository.cpython-313.pyc differ diff --git a/app/repositories/user_repository.py b/app/repositories/user_repository.py index 0142264..8b719eb 100644 --- a/app/repositories/user_repository.py +++ b/app/repositories/user_repository.py @@ -1,24 +1,24 @@ -class UserRepository: - users = [ - { - "id": 1, - "name": "akhdan", - "email": "akhdanre@gmail.com", - "password": "password123", - }, - { - "id": 2, - "name": "Bob", - "email": "bob@example.com", - "password": "password123", - }, - ] - - def get_all_users(self): - return self.users - - def get_user_by_email(self, email): - for user in self.users: - if user.get("email") == email: - return user - return None +class UserRepository: + users = [ + { + "id": 1, + "name": "akhdan", + "email": "akhdanre@gmail.com", + "password": "password123", + }, + { + "id": 2, + "name": "Bob", + "email": "bob@example.com", + "password": "password123", + }, + ] + + def get_all_users(self): + return self.users + + def get_user_by_email(self, email): + for user in self.users: + if user.get("email") == email: + return user + return None diff --git a/app/services/__init__.py b/app/services/__init__.py index e3e2049..cd02b82 100644 --- a/app/services/__init__.py +++ b/app/services/__init__.py @@ -1,2 +1,2 @@ -from .auth_service import AuthService -from .user_service import UserService +from .auth_service import AuthService +from .user_service import UserService diff --git a/app/services/__pycache__/user_service.cpython-313.pyc b/app/services/__pycache__/user_service.cpython-313.pyc index 609b0b5..b818d11 100644 Binary files a/app/services/__pycache__/user_service.cpython-313.pyc and b/app/services/__pycache__/user_service.cpython-313.pyc differ diff --git a/app/services/auth_service.py b/app/services/auth_service.py index fbb7c60..f834ef4 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -1,21 +1,21 @@ -from repositories import UserRepository - - -class AuthService: - def __init__(self): - self.user_repository = UserRepository() - - def login(self, data): - email = data.get("email") - password = data.get("password") - - user_data = self.user_repository.get_user_by_email(email) - - if user_data == None: - return None - - if user_data["password"] == password: - del user_data["password"] - return user_data - - return None +from repositories import UserRepository + + +class AuthService: + def __init__(self): + self.user_repository = UserRepository() + + def login(self, data): + email = data.get("email") + password = data.get("password") + + user_data = self.user_repository.get_user_by_email(email) + + if user_data == None: + return None + + if user_data["password"] == password: + del user_data["password"] + return user_data + + return None diff --git a/app/services/lstm.py b/app/services/lstm.py index 9fad3c1..dd52124 100644 --- a/app/services/lstm.py +++ b/app/services/lstm.py @@ -1,53 +1,53 @@ -import numpy as np - - -class LSTM: - def __init__(self, input_dim, hidden_dim): - self.input_dim = input_dim - self.hidden_dim = hidden_dim - self.Wf = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 - self.Wi = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 - self.Wc = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 - self.Wo = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 - self.bf = np.zeros((hidden_dim, 1)) - self.bi = np.zeros((hidden_dim, 1)) - self.bc = np.zeros((hidden_dim, 1)) - self.bo = np.zeros((hidden_dim, 1)) - self.h = np.zeros((hidden_dim, 1)) - self.c = np.zeros((hidden_dim, 1)) - - def sigmoid(self, x): - return 1 / (1 + np.exp(-x)) - - def tanh(self, x): - return np.tanh(x) - - def forward(self, x_t): - combined = np.vstack((self.h, x_t)) - f_t = self.sigmoid(np.dot(self.Wf, combined) + self.bf) - i_t = self.sigmoid(np.dot(self.Wi, combined) + self.bi) - C_tilde_t = self.tanh(np.dot(self.Wc, combined) + self.bc) - self.c = f_t * self.c + i_t * C_tilde_t - o_t = self.sigmoid(np.dot(self.Wo, combined) + self.bo) - self.h = o_t * self.tanh(self.c) - return self.h - - def backward(self, x_t, h_t, y_t, learning_rate): - # Your backward pass implementation here - pass - - def train(self, X, y, num_epochs, learning_rate): - for epoch in range(num_epochs): - for i in range(len(X)): - x_t = X[i] - y_t = y[i] - - # Forward pass - h_t = self.forward(x_t) - - # Calculate loss and perform backward pass - loss = np.mean((h_t - y_t) ** 2) # Example loss - self.backward(x_t, h_t, y_t, learning_rate) - - if i % 100 == 0: # Print loss every 100 samples - print(f"Epoch {epoch}, Sample {i}, Loss: {loss}") +import numpy as np + + +class LSTM: + def __init__(self, input_dim, hidden_dim): + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.Wf = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 + self.Wi = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 + self.Wc = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 + self.Wo = np.random.randn(hidden_dim, input_dim + hidden_dim) * 0.01 + self.bf = np.zeros((hidden_dim, 1)) + self.bi = np.zeros((hidden_dim, 1)) + self.bc = np.zeros((hidden_dim, 1)) + self.bo = np.zeros((hidden_dim, 1)) + self.h = np.zeros((hidden_dim, 1)) + self.c = np.zeros((hidden_dim, 1)) + + def sigmoid(self, x): + return 1 / (1 + np.exp(-x)) + + def tanh(self, x): + return np.tanh(x) + + def forward(self, x_t): + combined = np.vstack((self.h, x_t)) + f_t = self.sigmoid(np.dot(self.Wf, combined) + self.bf) + i_t = self.sigmoid(np.dot(self.Wi, combined) + self.bi) + C_tilde_t = self.tanh(np.dot(self.Wc, combined) + self.bc) + self.c = f_t * self.c + i_t * C_tilde_t + o_t = self.sigmoid(np.dot(self.Wo, combined) + self.bo) + self.h = o_t * self.tanh(self.c) + return self.h + + def backward(self, x_t, h_t, y_t, learning_rate): + # Your backward pass implementation here + pass + + def train(self, X, y, num_epochs, learning_rate): + for epoch in range(num_epochs): + for i in range(len(X)): + x_t = X[i] + y_t = y[i] + + # Forward pass + h_t = self.forward(x_t) + + # Calculate loss and perform backward pass + loss = np.mean((h_t - y_t) ** 2) # Example loss + self.backward(x_t, h_t, y_t, learning_rate) + + if i % 100 == 0: # Print loss every 100 samples + print(f"Epoch {epoch}, Sample {i}, Loss: {loss}") diff --git a/app/services/user_service.py b/app/services/user_service.py index a9da91e..bd5d5e2 100644 --- a/app/services/user_service.py +++ b/app/services/user_service.py @@ -1,9 +1,9 @@ -from repositories import UserRepository - - -class UserService: - def __init__(self): - self.user_repository = UserRepository() - - def get_all_users(self): - return self.user_repository.get_all_users() +from repositories import UserRepository + + +class UserService: + def __init__(self): + self.user_repository = UserRepository() + + def get_all_users(self): + return self.user_repository.get_all_users() diff --git a/requirement.txt b/requirement.txt index 34fec9b..2f43e12 100644 --- a/requirement.txt +++ b/requirement.txt @@ -1,4 +1,5 @@ -Flask==3.0.3 -numpy==2.1.2 -pymongo -Flask-PyMongo +Flask==3.0.3 +numpy==2.1.2 +pymongo +Flask-PyMongo +python-dotenv