JairoDanielMT commited on
Commit
f5c0d34
·
verified ·
1 Parent(s): ab8fcaa

Upload 9 files

Browse files
Files changed (9) hide show
  1. Dockerfile +15 -0
  2. app.py +70 -0
  3. create_database.py +47 -0
  4. models.py +25 -0
  5. requeriments.txt +0 -0
  6. routers/review.py +109 -0
  7. routers/teacher.py +119 -0
  8. routers/user.py +81 -0
  9. site.db +0 -0
Dockerfile ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Usa una imagen base de Python
2
+ FROM python:3.11
3
+ # Establece el directorio de trabajo
4
+ WORKDIR /code
5
+
6
+ # Copia los archivos necesarios al contenedor
7
+ COPY ./requirements.txt /code/requirements.txt
8
+ RUN pip install --no-cache-dir -r /code/requirements.txt
9
+
10
+ COPY . .
11
+
12
+ RUN chmod -R 777 /code
13
+
14
+ # Comando para ejecutar la aplicación
15
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from fastapi import FastAPI, Depends, HTTPException, status
3
+ from fastapi.responses import FileResponse
4
+ from fastapi.security import HTTPBasic, HTTPBasicCredentials
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+ from dotenv import load_dotenv
7
+ from create_database import create_db
8
+ from routers import teacher, review, user
9
+
10
+ # Cargar variables de entorno desde el archivo .env
11
+ load_dotenv()
12
+ if not os.path.exists("site.db"):
13
+ create_db()
14
+
15
+ # Obtener credenciales de las variables de entorno
16
+ BASIC_AUTH_USER = os.getenv("BASIC_AUTH_USER")
17
+ BASIC_AUTH_PASSWORD = os.getenv("BASIC_AUTH_PASSWORD")
18
+
19
+
20
+ app = FastAPI(
21
+ title="API de revisión de profesores",
22
+ description="API para revisar profesores",
23
+ version="2.8.7",
24
+ openapi_url="/teacher-openapi.json",
25
+ docs_url="/teacher-docs",
26
+ redoc_url="/teacher-redoc",
27
+ contact={
28
+ "name": "teacher",
29
+ "url": "https://www.test.com",
30
+ "email": "calificandoprofesoruniversidad@gmail.com",
31
+ },
32
+ license_info={"name": "MIT", "url": "https://opensource.org/licenses/MIT"},
33
+ )
34
+
35
+ # CORS
36
+ app.add_middleware(
37
+ CORSMiddleware,
38
+ allow_origins=["*"],
39
+ allow_credentials=True,
40
+ allow_methods=["*"],
41
+ allow_headers=["*"],
42
+ )
43
+
44
+ security = HTTPBasic()
45
+
46
+
47
+ def authenticate(credentials: HTTPBasicCredentials = Depends(security)):
48
+ if (
49
+ credentials.username != BASIC_AUTH_USER
50
+ or credentials.password != BASIC_AUTH_PASSWORD
51
+ ):
52
+ raise HTTPException(
53
+ status_code=status.HTTP_401_UNAUTHORIZED,
54
+ detail="Credenciales incorrectas",
55
+ headers={"WWW-Authenticate": "Basic"},
56
+ )
57
+
58
+
59
+ @app.get(
60
+ "/",
61
+ summary="Saludo",
62
+ description="Saludo de la API",
63
+ )
64
+ def read_root():
65
+ return {"message": "Bienvenido a la API de la revisión de profesores"}
66
+
67
+
68
+ app.include_router(teacher.router, dependencies=[Depends(authenticate)])
69
+ app.include_router(review.router, dependencies=[Depends(authenticate)])
70
+ app.include_router(user.router, dependencies=[Depends(authenticate)])
create_database.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+
3
+
4
+ def create_db():
5
+ # Conexión a la base de datos
6
+ conn = sqlite3.connect("site.db")
7
+ cursor = conn.cursor()
8
+
9
+ # Crear tablas
10
+ cursor.execute(
11
+ """
12
+ CREATE TABLE IF NOT EXISTS user (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
14
+ username TEXT UNIQUE NOT NULL,
15
+ email TEXT UNIQUE NOT NULL,
16
+ password TEXT NOT NULL
17
+ )
18
+ """
19
+ )
20
+
21
+ cursor.execute(
22
+ """
23
+ CREATE TABLE IF NOT EXISTS teacher (
24
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
25
+ name TEXT NOT NULL,
26
+ department TEXT NOT NULL
27
+ )
28
+ """
29
+ )
30
+
31
+ cursor.execute(
32
+ """
33
+ CREATE TABLE IF NOT EXISTS review (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ content TEXT NOT NULL,
36
+ rating INTEGER NOT NULL,
37
+ date_posted DATETIME NOT NULL DEFAULT (datetime('now')),
38
+ teacher_id INTEGER NOT NULL,
39
+ user_id INTEGER,
40
+ FOREIGN KEY (teacher_id) REFERENCES teacher(id),
41
+ FOREIGN KEY (user_id) REFERENCES user(id)
42
+ )
43
+ """
44
+ )
45
+
46
+ conn.commit()
47
+ conn.close()
models.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel, Field
2
+ from datetime import datetime
3
+ from typing import Optional
4
+
5
+
6
+ class User(BaseModel):
7
+ id: Optional[int] = None
8
+ username: str = Field(..., max_length=20)
9
+ email: str = Field(..., max_length=120)
10
+ password: str = Field(..., max_length=60)
11
+
12
+
13
+ class Teacher(BaseModel):
14
+ id: int
15
+ name: str = Field(..., max_length=100)
16
+ department: str = Field(..., max_length=100)
17
+
18
+
19
+ class Review(BaseModel):
20
+ id: Optional[int] = None
21
+ content: str
22
+ rating: int
23
+ date_posted: datetime = Field(default_factory=datetime.now)
24
+ teacher_id: int
25
+ user_id: Optional[int] = None
requeriments.txt ADDED
File without changes
routers/review.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ import sqlite3
3
+ from typing import Optional
4
+ from fastapi import APIRouter
5
+ from pydantic import BaseModel, Field
6
+
7
+ from models import Review
8
+
9
+ router = APIRouter(
10
+ prefix="/review",
11
+ tags=["Review"],
12
+ responses={404: {"description": "Not found"}},
13
+ )
14
+
15
+ """
16
+ CREATE TABLE IF NOT EXISTS review (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ content TEXT NOT NULL,
19
+ rating INTEGER NOT NULL,
20
+ date_posted DATETIME NOT NULL DEFAULT (datetime('now')),
21
+ teacher_id INTEGER NOT NULL,
22
+ user_id INTEGER,
23
+ FOREIGN KEY (teacher_id) REFERENCES teacher(id),
24
+ FOREIGN KEY (user_id) REFERENCES user(id)
25
+ )
26
+ """
27
+
28
+
29
+ @router.get("/")
30
+ def get_reviews():
31
+ """
32
+ Get all reviews
33
+ """
34
+ try:
35
+ conn = sqlite3.connect("site.db")
36
+ cursor = conn.cursor()
37
+ cursor.execute("SELECT * FROM review")
38
+ reviews = cursor.fetchall()
39
+ conn.close()
40
+ return reviews
41
+ except Exception as e:
42
+ return []
43
+
44
+
45
+ @router.get("/{review_id}")
46
+ def get_review(review_id: int):
47
+ """
48
+ Get a review by id
49
+ """
50
+ try:
51
+ conn = sqlite3.connect("site.db")
52
+ cursor = conn.cursor()
53
+ cursor.execute("SELECT * FROM review WHERE id=?", (review_id,))
54
+ review = cursor.fetchone()
55
+ conn.close()
56
+ # retornar en formato json
57
+ review = Review(
58
+ id=review[0],
59
+ content=review[1],
60
+ rating=review[2],
61
+ date_posted=review[3],
62
+ teacher_id=review[4],
63
+ user_id=review[5],
64
+ )
65
+ return review
66
+ except Exception as e:
67
+ return []
68
+
69
+
70
+ class ReviewPost(BaseModel):
71
+ content: str
72
+ rating: int
73
+ date_posted: datetime = Field(default_factory=datetime.now)
74
+ teacher_id: int
75
+
76
+
77
+ @router.post("/")
78
+ def create_review(r: ReviewPost):
79
+ """
80
+ Create a review
81
+ """
82
+ try:
83
+ conn = sqlite3.connect("site.db")
84
+ cursor = conn.cursor()
85
+ cursor.execute(
86
+ "INSERT INTO review (content, rating, teacher_id, user_id) VALUES (?, ?, ?, ?)",
87
+ (r.content, r.rating, r.teacher_id, 1),
88
+ )
89
+ conn.commit()
90
+ conn.close()
91
+ return {"message": "Review created"}
92
+ except Exception as e:
93
+ return {"message": "Error creating review"}
94
+
95
+
96
+ @router.get("/search_review/{teacher_id}")
97
+ def get_reviews_by_teacher(teacher_id: int):
98
+ """
99
+ Get all reviews for a teacher
100
+ """
101
+ try:
102
+ conn = sqlite3.connect("site.db")
103
+ cursor = conn.cursor()
104
+ cursor.execute("SELECT * FROM review WHERE teacher_id=?", (teacher_id,))
105
+ reviews = cursor.fetchall()
106
+ conn.close()
107
+ return reviews
108
+ except Exception as e:
109
+ return []
routers/teacher.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+ from fastapi import APIRouter
3
+ from pydantic import BaseModel
4
+
5
+ from models import Teacher
6
+
7
+
8
+ router = APIRouter(
9
+ prefix="/teacher",
10
+ tags=["Teacher"],
11
+ responses={404: {"description": "No encontrado"}},
12
+ )
13
+
14
+ """
15
+ CREATE TABLE IF NOT EXISTS teacher (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ name TEXT NOT NULL,
18
+ department TEXT NOT NULL
19
+ )
20
+ """
21
+
22
+
23
+ @router.get("/")
24
+ def get_teachers():
25
+ """
26
+ Get all teachers
27
+ """
28
+ try:
29
+ conn = sqlite3.connect("site.db")
30
+ cursor = conn.cursor()
31
+ cursor.execute("SELECT * FROM teacher")
32
+ teachers = cursor.fetchall()
33
+ conn.close()
34
+ teachers = [Teacher(id=t[0], name=t[1], department=t[2]) for t in teachers]
35
+ return teachers
36
+ except Exception as e:
37
+ return []
38
+
39
+
40
+ @router.get("/{teacher_id}")
41
+ def get_teacher(teacher_id: int):
42
+ """
43
+ Get a teacher by id
44
+ """
45
+ try:
46
+ conn = sqlite3.connect("site.db")
47
+ cursor = conn.cursor()
48
+ cursor.execute("SELECT * FROM teacher WHERE id=?", (teacher_id,))
49
+ teacher = cursor.fetchone()
50
+ conn.close()
51
+ teacher = Teacher(id=teacher[0], name=teacher[1], department=teacher[2])
52
+ return teacher
53
+ except Exception as e:
54
+ return []
55
+
56
+
57
+ class TeacherPost(BaseModel):
58
+ name: str
59
+ department: str
60
+
61
+
62
+ @router.post("/")
63
+ def create_teacher(t: TeacherPost):
64
+ """
65
+ Create a teacher
66
+ """
67
+ try:
68
+ conn = sqlite3.connect("site.db")
69
+ cursor = conn.cursor()
70
+ cursor.execute(
71
+ "INSERT INTO teacher (name, department) VALUES (?, ?)",
72
+ (t.name, t.department),
73
+ )
74
+ conn.commit()
75
+ conn.close()
76
+ return {"status": "success", "message": "Teacher created"}
77
+ except Exception as e:
78
+ return {"status": "error", "message": str(e)}
79
+
80
+
81
+ # search by teacher name
82
+ @router.get("/search/{teacher_name}")
83
+ def search_teacher(teacher_name: str):
84
+ """
85
+ Search a teacher by name
86
+ """
87
+ try:
88
+ conn = sqlite3.connect("site.db")
89
+ cursor = conn.cursor()
90
+ cursor.execute(
91
+ "SELECT * FROM teacher WHERE name LIKE ?", (f"%{teacher_name}%",)
92
+ )
93
+ teacher = cursor.fetchall()
94
+ conn.close()
95
+ teacher = [Teacher(id=t[0], name=t[1], department=t[2]) for t in teacher]
96
+ return teacher
97
+ except Exception as e:
98
+ return []
99
+
100
+
101
+ # insertar una lista de profesores en la base de datos
102
+ @router.post("/bulk")
103
+ def bulk_teacher(teachers: list[TeacherPost]):
104
+ """
105
+ Bulk insert teachers
106
+ """
107
+ try:
108
+ conn = sqlite3.connect("site.db")
109
+ cursor = conn.cursor()
110
+ for t in teachers:
111
+ cursor.execute(
112
+ "INSERT INTO teacher (name, department) VALUES (?, ?)",
113
+ (t.name, t.department),
114
+ )
115
+ conn.commit()
116
+ conn.close()
117
+ return {"status": "success", "message": "Teachers created"}
118
+ except Exception as e:
119
+ return {"status": "error", "message": str(e)}
routers/user.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sqlite3
2
+ from typing import Optional
3
+ from fastapi import APIRouter
4
+ from pydantic import BaseModel, Field
5
+
6
+ from models import User
7
+
8
+ router = APIRouter(
9
+ prefix="/user",
10
+ tags=["User"],
11
+ responses={404: {"description": "Not found"}},
12
+ )
13
+
14
+ """
15
+ CREATE TABLE IF NOT EXISTS user (
16
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
17
+ username TEXT UNIQUE NOT NULL,
18
+ email TEXT UNIQUE NOT NULL,
19
+ password TEXT NOT NULL
20
+ )
21
+ """
22
+
23
+
24
+ @router.get("/")
25
+ def get_users():
26
+ """
27
+ Get all users
28
+ """
29
+ try:
30
+ conn = sqlite3.connect("site.db")
31
+ cursor = conn.cursor()
32
+ cursor.execute("SELECT * FROM user")
33
+ users = cursor.fetchall()
34
+ conn.close()
35
+ users = [User(id=u[0], username=u[1], email=u[2], password=u[3]) for u in users]
36
+ return users
37
+ except Exception as e:
38
+ return []
39
+
40
+
41
+ @router.get("/{user_id}")
42
+ def get_user(user_id: int):
43
+ """
44
+ Get a user by id
45
+ """
46
+ try:
47
+ conn = sqlite3.connect("site.db")
48
+ cursor = conn.cursor()
49
+ cursor.execute("SELECT * FROM user WHERE id=?", (user_id,))
50
+ user = cursor.fetchone()
51
+ conn.close()
52
+ user = User(id=user[0], username=user[1], email=user[2], password=user[3])
53
+ return user
54
+ except Exception as e:
55
+ return []
56
+
57
+
58
+ class UserPost(BaseModel):
59
+ id: Optional[int] = None
60
+ username: str = Field(..., max_length=20)
61
+ email: str = Field(..., max_length=120)
62
+ password: str = Field(..., max_length=60)
63
+
64
+
65
+ @router.post("/")
66
+ def create_user(u: User):
67
+ """
68
+ Create a user
69
+ """
70
+ try:
71
+ conn = sqlite3.connect("site.db")
72
+ cursor = conn.cursor()
73
+ cursor.execute(
74
+ "INSERT INTO user (username, email, password) VALUES (?, ?, ?)",
75
+ (u.username, u.email, u.password),
76
+ )
77
+ conn.commit()
78
+ conn.close()
79
+ return {"message": "User created"}
80
+ except Exception as e:
81
+ return {"message": "Error"}
site.db ADDED
Binary file (28.7 kB). View file