Compare commits
6 Commits
lab2
...
7ef08e64c2
| Author | SHA1 | Date | |
|---|---|---|---|
| 7ef08e64c2 | |||
| 9f5c2505de | |||
| 9fe9a112e7 | |||
| a5c5c1850d | |||
| 2fcb8aa276 | |||
|
cfe3fa5fc7
|
@@ -1 +1,2 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
|
*.env
|
||||||
|
|||||||
@@ -13,3 +13,7 @@ docker-compose up
|
|||||||
```
|
```
|
||||||
|
|
||||||
That should be enough to get the server up and running.
|
That should be enough to get the server up and running.
|
||||||
|
|
||||||
|
## Lab3 specifics
|
||||||
|
|
||||||
|
Variant for functionality extension: 27 % 3 = 0 => Income accountance
|
||||||
|
|||||||
+78
-13
@@ -1,10 +1,61 @@
|
|||||||
from flask import Flask, request
|
from flask import Flask, request, jsonify
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
from app.local_db import LocalDB
|
import uuid
|
||||||
|
|
||||||
|
from marshmallow import Schema, fields
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
ldb = LocalDB()
|
app.config.from_pyfile('config.py', silent=True)
|
||||||
|
|
||||||
|
db = SQLAlchemy(app)
|
||||||
|
|
||||||
|
class UserModel(db.Model):
|
||||||
|
__tablename__ = "user"
|
||||||
|
uuid = db.Column(db.String(32), unique=True, primary_key=True, nullable=False)
|
||||||
|
name = db.Column(db.String(64), nullable=False)
|
||||||
|
|
||||||
|
class CategoryModel(db.Model):
|
||||||
|
__tablename__ = "category"
|
||||||
|
uuid = db.Column(db.String(32), unique=True, primary_key=True, nullable=False)
|
||||||
|
name = db.Column(db.String(64), nullable=False)
|
||||||
|
|
||||||
|
class RecordModel(db.Model):
|
||||||
|
__tablename__ = "record"
|
||||||
|
uuid = db.Column(db.String(32), primary_key=True, nullable=False)
|
||||||
|
user_uuid = db.Column(db.String(32), db.ForeignKey('user.uuid'))
|
||||||
|
cat_uuid = db.Column(db.String(32), db.ForeignKey('category.uuid'))
|
||||||
|
date = db.Column(db.Date)
|
||||||
|
amount = db.Column(db.Integer)
|
||||||
|
|
||||||
|
class UserSchema(Schema):
|
||||||
|
uuid = fields.Str()
|
||||||
|
name = fields.Str()
|
||||||
|
|
||||||
|
class CategorySchema(Schema):
|
||||||
|
uuid = fields.Str()
|
||||||
|
name = fields.Str()
|
||||||
|
|
||||||
|
class RecordSchema(Schema):
|
||||||
|
uuid = fields.Str()
|
||||||
|
user_uuid = fields.Str()
|
||||||
|
cat_uuid = fields.Str()
|
||||||
|
date = fields.Date()
|
||||||
|
amount = fields.Integer()
|
||||||
|
|
||||||
|
user_schema = UserSchema()
|
||||||
|
users_schema = UserSchema(many = True)
|
||||||
|
|
||||||
|
category_schema = CategorySchema()
|
||||||
|
categories_schema = CategorySchema(many = True)
|
||||||
|
|
||||||
|
record_schema = RecordSchema()
|
||||||
|
records_schema = RecordSchema(many = True)
|
||||||
|
|
||||||
|
# "migration"
|
||||||
|
with app.app_context():
|
||||||
|
db.create_all()
|
||||||
|
|
||||||
@app.route("/healthcheck")
|
@app.route("/healthcheck")
|
||||||
def ep_healthcheck():
|
def ep_healthcheck():
|
||||||
@@ -15,12 +66,12 @@ def ep_healthcheck():
|
|||||||
|
|
||||||
@app.route("/reset_users_because_postman_is_dumb_like_that")
|
@app.route("/reset_users_because_postman_is_dumb_like_that")
|
||||||
def ep_reset():
|
def ep_reset():
|
||||||
ldb.reset()
|
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
@app.route("/users", methods = ["GET"])
|
@app.route("/users", methods = ["GET"])
|
||||||
def ep_users_get():
|
def ep_users_get():
|
||||||
return ldb.get_users()
|
result = db.session.query(UserModel).all()
|
||||||
|
return users_schema.dumps(result)
|
||||||
|
|
||||||
@app.route("/user/<user_id>", methods = ["GET"])
|
@app.route("/user/<user_id>", methods = ["GET"])
|
||||||
def ep_user_get(user_id):
|
def ep_user_get(user_id):
|
||||||
@@ -35,16 +86,30 @@ def ep_user_get(user_id):
|
|||||||
def ep_user_post():
|
def ep_user_post():
|
||||||
body = request.json
|
body = request.json
|
||||||
|
|
||||||
if 'name' in body:
|
if not body:
|
||||||
r = ldb.add_user(body['name'])
|
|
||||||
|
|
||||||
if 'uuid' in r:
|
|
||||||
return r
|
|
||||||
else:
|
|
||||||
return r, 403
|
|
||||||
else:
|
|
||||||
return {}, 403
|
return {}, 403
|
||||||
|
|
||||||
|
if 'uuid' in body:
|
||||||
|
return {}, 403
|
||||||
|
|
||||||
|
body.update({'uuid': uuid.uuid4().hex})
|
||||||
|
|
||||||
|
try:
|
||||||
|
_ = user_schema.load(body)
|
||||||
|
except ValidationError as e:
|
||||||
|
return {}, 403
|
||||||
|
|
||||||
|
u = UserModel(**body)
|
||||||
|
|
||||||
|
try:
|
||||||
|
db.session.add(u)
|
||||||
|
db.session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
db.session.rollback()
|
||||||
|
return {}, 403
|
||||||
|
|
||||||
|
return jsonify(user_schema.load(body)), 200
|
||||||
|
|
||||||
@app.route("/user/<user_id>", methods = ["DELETE"])
|
@app.route("/user/<user_id>", methods = ["DELETE"])
|
||||||
def ep_user_delete(user_id):
|
def ep_user_delete(user_id):
|
||||||
r = ldb.del_user(user_id)
|
r = ldb.del_user(user_id)
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
PROPAGATE_EXCEPTIONS = True
|
||||||
|
SQLALCHEMY_DATABASE_URI = f'postgresql://{os.environ["POSTGRES_USER"]}:{os.environ["POSTGRES_PASSWORD"]}@db:5432/accountance'
|
||||||
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||||
|
API_TITLE = "Finance REST API"
|
||||||
|
API_VERSION = 'v1'
|
||||||
@@ -12,3 +12,13 @@ services:
|
|||||||
- "12402:12402"
|
- "12402:12402"
|
||||||
volumes:
|
volumes:
|
||||||
- ./app:/app/app
|
- ./app:/app/app
|
||||||
|
env_file:
|
||||||
|
- db.env
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
|
||||||
|
db:
|
||||||
|
restart: unless-stopped
|
||||||
|
image: postgres:17.2-alpine3.21
|
||||||
|
env_file:
|
||||||
|
- db.env
|
||||||
|
|||||||
@@ -1,7 +1,20 @@
|
|||||||
|
alembic==1.14.0
|
||||||
|
apispec==6.8.0
|
||||||
blinker==1.8.2
|
blinker==1.8.2
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
Flask==3.0.3
|
Flask==3.0.3
|
||||||
|
Flask-Migrate==4.0.7
|
||||||
|
flask-smorest==0.45.0
|
||||||
|
Flask-SQLAlchemy==3.1.1
|
||||||
|
greenlet==3.1.1
|
||||||
itsdangerous==2.2.0
|
itsdangerous==2.2.0
|
||||||
Jinja2==3.1.4
|
Jinja2==3.1.4
|
||||||
|
Mako==1.3.8
|
||||||
MarkupSafe==2.1.5
|
MarkupSafe==2.1.5
|
||||||
|
marshmallow==3.23.2
|
||||||
|
packaging==24.2
|
||||||
|
psycopg2-binary==2.9.10
|
||||||
|
SQLAlchemy==2.0.36
|
||||||
|
typing_extensions==4.12.2
|
||||||
|
webargs==8.6.0
|
||||||
Werkzeug==3.0.4
|
Werkzeug==3.0.4
|
||||||
|
|||||||
Reference in New Issue
Block a user