initial

parents
No preview for this file type
from sqlalchemy import create_engine, ForeignKey, Date, Enum as SQLEnum
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import Column, Integer, String, SmallInteger
from enum import Enum
# Database configuration
SQLALCHEMY_DATABASE_URL ="mysql+pymysql://webapp:Ej]mMitZ8r;0)BzAp@localhost/webapp"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# Enum for loan status
class LoanStatus(str, Enum):
reserved = "reserved"
started = "started"
ended = "ended"
# SQLAlchemy Models
class UserDB(Base):
tablename_= "user"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
email = Column(String(50), unique=True, nullable=False)
password = Column(String(256), nullable=False)
role = Column(SmallInteger, nullable=False, default=0)
# Relationships
books = relationship("BookDB", back_populates="owner_rel")
loans = relationship("LoanDB", back_populates="user")
# Database Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
\ No newline at end of file
from typing import List
from datetime import date
from fastapi import FastAPI, HTTPException, Depends
from passlib.context import CryptContext
from typing import Optional
from pydantic import BaseModel, EmailStr
from datetime import date
from sqlalchemy.orm import Session
from database import *
# Pydantic Models
class UserBase(BaseModel):
email: EmailStr
role: int = 0
class UserCreate(UserBase):
password: str
class User(UserBase):
id: int
class Config:
from_attributes = True
# Password hashing
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
app = FastAPI()
# User CRUD Operations
@app.post("/users/", response_model=User)
def create_user(user: UserCreate, db: Session = Depends(get_db)):
db_user = db.query(UserDB).filter(UserDB.email == user.email).first()
if db_user:
raise HTTPException(status_code=400, detail="Email already registered")
hashed_password = pwd_context.hash(user.password)
db_user = UserDB(
email=user.email,
password=hashed_password,
role=user.role
)
try:
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
except Exception as e:
db.rollback()
raise HTTPException(status_code=400, detail=str(e))
@app.get("/users/", response_model=List[User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
users = db.query(UserDB).offset(skip).limit(limit).all()
return users
@app.get("/users/{user_id}", response_model=User)
def read_user(user_id: int, db: Session = Depends(get_db)):
db_user = db.query(UserDB).filter(UserDB.id == user_id).first()
if db_user is None:
raise HTTPException(status_code=404, detail="User not found")
return db_user
-- phpMyAdmin SQL Dump
-- version 5.1.1deb5ubuntu1
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Generation Time: Feb 20, 2025 at 02:02 PM
-- Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1
-- PHP Version: 8.1.2-1ubuntu2.20
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `webapp`
--
-- --------------------------------------------------------
--
-- Table structure for table `book`
--
CREATE TABLE `book` (
`id` int(10) UNSIGNED NOT NULL,
`owner` int(10) UNSIGNED NOT NULL,
`title` varchar(80) NOT NULL,
`author` varchar(80) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- --------------------------------------------------------
--
-- Table structure for table `loan`
--
CREATE TABLE `loan` (
`id_user` int(10) UNSIGNED NOT NULL,
`id_book` int(10) UNSIGNED NOT NULL,
`status` enum('reserved','started','ended','') NOT NULL,
`start` date NOT NULL,
`end` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- --------------------------------------------------------
--
-- Table structure for table `user`
--
CREATE TABLE `user` (
`id` int(10) UNSIGNED NOT NULL,
`email` varchar(50) NOT NULL,
`password` varchar(256) NOT NULL,
`role` tinyint(3) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `book`
--
ALTER TABLE `book`
ADD PRIMARY KEY (`id`),
ADD KEY `owner` (`owner`);
--
-- Indexes for table `loan`
--
ALTER TABLE `loan`
ADD KEY `id_book` (`id_book`),
ADD KEY `id_user` (`id_user`);
--
-- Indexes for table `user`
--
ALTER TABLE `user`
ADD PRIMARY KEY (`id`);
--
-- Constraints for dumped tables
--
--
-- Constraints for table `book`
--
ALTER TABLE `book`
ADD CONSTRAINT `book_ibfk_1` FOREIGN KEY (`owner`) REFERENCES `user` (`id`);
--
-- Constraints for table `loan`
--
ALTER TABLE `loan`
ADD CONSTRAINT `loan_ibfk_1` FOREIGN KEY (`id_book`) REFERENCES `book` (`id`),
ADD CONSTRAINT `loan_ibfk_2` FOREIGN KEY (`id_user`) REFERENCES `user` (`id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
\ 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 sign in to comment