-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpost.py
209 lines (167 loc) · 5.81 KB
/
post.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
"""
Modul pre prispevky so spracovanim API REST poziadaviek
"""
from flask import make_response, abort
from config import db
from models import Post, PostSchema
from external_api import getExternalApiPost, getExternalApiUser
def get_all():
"""
Funkcia pre kompletny zoznam prispevkov
:return: zoznam vsetkych prispevkov v json formate
"""
posts = Post.query.order_by(Post.id).all()
post_schema = PostSchema(many=True)
data = post_schema.dump(posts)
return data
def get(id):
"""
Funkcia pre nacitanie prispevku z databazy
Pokial sa nenajde, tak sa vykona:
- stiahnutie dat z externej api
- zavolanie funkcie create a pridanie dat z externej api
:param id: Id prispevku
:return: 200 ok, prispevok sa nasiel
404 chyba, prispevok sa nenasiel cez externu api
000 dalsie statusy podla funkcie create
"""
# Nacitanie prispevku z DB
post = Post.query.filter(Post.id == id).one_or_none()
# Ak s aprispevok nasiel v DB
if post is not None:
# Prevod z objekt DB na json format
post_schema = PostSchema()
data = post_schema.dump(post)
return data, 200
else:
data = getExternalApiPost(id)
# Ak vrati error, prispevok sa nepodarilo nacitat z externej api
if 'error' in data:
abort(
404,
"Prispevok s id {id} sa nenasiel cez externu api".format(id=id),
)
# Ak sa prispevok nasiel, tak sa posle cez create do DB
else:
create(data)
def create(post_data):
"""
Funkcia pre vytvorenie noveho prispevku na zaklade post_data
:param json post_data: data prispevoku pre vytvorenie person to create in people structure
:return: 201 ok, data pridane do DB
406 chyba, pouzivatel sa nenasiel
409 chyba, prispevok uz existuje
"""
id = post_data.get("id")
userId = post_data.get("userId")
post_exists = (
Post.query.filter(Post.id == id)
.one_or_none()
)
#Nacitanie id uzivatela, cez externe API
user_exists = getExternalApiUser(userId)
#Ak je error, tak vratilo prazdne data
if 'error' in user_exists:
abort(
404,
"Pouzivatel s id {id} neexistuje".format(id=userId),
)
# Prispevok nesmie existovat
if post_exists is None:
# Vytvori schemu pre prispevok a nacita data do modelu Post
schema = PostSchema()
post_new = schema.load(post_data, session=db.session)
# Prida prispevok do DB
db.session.add(post_new)
db.session.commit()
# Prevedie data z modelu do jsonu
data = schema.dump(post_new)
return data, 201
# Prispevok uz existuje
else:
abort(
409,
"Prispevok s id {id} uz existuje".format(id=id),
)
def update(id, post_data):
"""
Funkcia pre aktualizáciu existujúceho príspevku
Vráti chybu, pokiaľ aktualizované dáta sú zhodné s existujúcimi
Vráti chybu, pokiaľ id prispevku nie je v DB
Id pouzivatela sa tu neoveruje, kedze zmena je iba pri title, body
:param int id: id prispevku, ktory cheme aktualizovat
:param json post_data: data na aktualizaciu prispevku
:return: 200 ok, vrati strukturu prispevku
404 chyba, prispevok sa nenasiel
409 chyba, uz existuje
"""
# Vyziada prispevok z DB na zaklade id
post_upd = Post.query.filter(
Post.id == id
).one_or_none()
# vyziada rovnaky prispevok z DB ako je aktualizovany aj so vsetkymi rovnakymi hodnotami
id = post_data.get("id")
userId = post_data.get("userId")
title = post_data.get("title")
body = post_data.get("body")
post_exists = (
Post.query.filter(Post.id == id)
.filter(Post.userId == userId)
.filter(Post.title == title)
.filter(Post.body == body)
.one_or_none()
)
# pokial sa nenaslo id v DB, tak nemoze aktualizovat prispevok
if post_upd is None:
abort(
404,
"Prispevok s id {id} sa nenasiel!".format(id=id),
)
# aktualizovany prispevok uz existuje
elif (
post_exists is not None and post_exists.id != id
):
abort(
409,
"Prispevok s id {id} uz existuje".format(id=id),
)
# ak je vsetko v poriadku, prejde sa na update
else:
# Fix pre aktualizaciu - kedze SQL Alchemy vyhadzuje chybu
# s chybajucimi datami, tj tie co su nullable
# Preto zoberiem strukturu dat z DB
# a doplnim mu upravene data
post_upd.setDataFromJson(post_data)
# schema prevedie Model na objekt DB
schema = PostSchema()
# spoji novy objekt zo starym
db.session.merge(post_upd)
# commitne/ulozi ju do DB
db.session.commit()
# prevedie data spat z objekt DB na Model
data = schema.dump(post_upd)
# vrati aktualizovany prispevok
return data, 200
def delete(id):
"""
Funkcia pre zmazanie prispevku z DB
:param id: id prispevku pre zmazanie
:return: 200 ok, pre uspesne zmazanie
404 chyba, prispevok sa nenasiel
"""
# Ziskanie prispevku z databazy
post = Post.query.filter(Post.id == id).one_or_none()
# Ak sa prispevku najde v DB
if post is not None:
db.session.delete(post)
db.session.commit()
return make_response(
"Prispevok s id {id} uspesne zamazny!".format(id=id),
200
)
# Prispevok sa nenasiel v DB
else:
abort(
404,
"Prispevok s id {id} sa nenasiel v DB!".format(id=id),
)