Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,4 @@ database.database
database.db
diagram.png
__pycache__/
migrations
155 changes: 0 additions & 155 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

107 changes: 101 additions & 6 deletions src/api/models.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,114 @@
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import String, Boolean
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import String, Boolean, Text, DateTime, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from datetime import datetime, timezone
from typing import List

db = SQLAlchemy()


class User(db.Model):
__tablename__ = "user_table"

id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(String(120), unique=True, nullable=False)
name: Mapped[str] = mapped_column(String(120), nullable=False)
email: Mapped[str] = mapped_column(
String(120), unique=True, nullable=False)
password: Mapped[str] = mapped_column(nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean(), nullable=False)
avatar_url: Mapped[str] = mapped_column(String(500), unique=True)

# cascade-delete permite que, al borrar user, se borren todos los folders, lo mismo con goals.leer más en la documetacion,
folders: Mapped[List["Folder"]] = relationship(
back_populates="user", cascade="all, delete-orphan")

goals: Mapped[List["Goals"]] = relationship(
back_populates="user", cascade="all, delete-orphan")

def serialize(self):
return {
"id": self.id,
"name": self.name,
"email": self.email,
# do not serialize the password, its a security breach
}
"avatar_url": self.avatar_url
}


class Folder(db.Model):
__tablename__ = "folder_table"

id: Mapped[int] = mapped_column(primary_key=True)

user_id: Mapped[int] = mapped_column(
ForeignKey("user_table.id"), nullable=False)
user: Mapped["User"] = relationship(back_populates="folders")

pages: Mapped[List["Page"]] = relationship(
back_populates="folder", cascade="all, delete-orphan")

title: Mapped[str] = mapped_column(String(120), nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))

def serialize(self):
return {
"id": self.id,
"title": self.title,
"pages": [page.serialize() for page in self.pages],
"created_at": self.created_at
}


class Page(db.Model):
__tablename__ = "page_table"

id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(
String(120), unique=True, nullable=False)
content: Mapped[str] = mapped_column(Text, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))
update_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))

folder_id: Mapped[int] = mapped_column(
ForeignKey("folder_table.id"), nullable=False)
folder: Mapped["Folder"] = relationship(back_populates="pages")

def serialize(self):
return {
"id": self.id,
"title": self.title,
"content": self.content,
"folder": {
"id": self.folder.id,
"title": self.folder.title
},
"created_at": self.created_at.isoformat(),
"update_at": self.update_at.isoformat()
}


class Goals(db.Model):
__tablename__ = "goal_table"

id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(
String(120), unique=True, nullable=False)
content: Mapped[str] = mapped_column(Text, nullable=False)
status: Mapped[str] = mapped_column(
String(20), nullable=False, default="not_started")
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))

user_id: Mapped[int] = mapped_column(
ForeignKey("user_table.id"), nullable=False)
user: Mapped["User"] = relationship(back_populates="goals")

def serialize(self):
return {
"id": self.id,
"title": self.title,
"content": self.content,
"status": self.status,
"created_at": self.created_at
}
Empty file added src/api/routes/__init__.py
Empty file.
13 changes: 13 additions & 0 deletions src/api/routes/user_routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from flask import Flask, request, jsonify, url_for, Blueprint
from api.models import db, User

user_bp = Blueprint('user', __name__)

@user_bp.route('/hello', methods=['POST', 'GET'])
def handle_hello():

response_body = {
"message": "Hello! I'm a message that came from the backend, check the network tab on the google inspector and you will see the GET request"
}

return jsonify(response_body), 200
2 changes: 2 additions & 0 deletions src/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from api.utils import APIException, generate_sitemap
from api.models import db
from api.routes import api
from api.routes.user_routes import user_bp
from api.admin import setup_admin
from api.commands import setup_commands

Expand Down Expand Up @@ -39,6 +40,7 @@

# Add all endpoints form the API with a "api" prefix
app.register_blueprint(api, url_prefix='/api')
app.register_blueprint(user_bp, url_prefix='/api/user')

# Handle/serialize errors like a JSON object

Expand Down