Skip to content

Commit bd8bda5

Browse files
committed
created structure of users api
1 parent 58761dc commit bd8bda5

2 files changed

Lines changed: 131 additions & 2 deletions

File tree

app/src/routes/users.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from apiflask import APIBlueprint
2+
from flask import g, request
23

3-
users_bp = APIBlueprint(
4+
import uuid
5+
import schema
6+
import datetime
7+
8+
users = APIBlueprint(
49
"users_blueprint",
510
__name__,
611
tag={
@@ -10,6 +15,78 @@
1015
)
1116

1217

13-
@users_bp.route("/api/v1/users")
18+
@users.before_request
19+
def assign_request_id():
20+
g.request_id = request.headers.get("X-Request-ID", str(uuid.uuid4()))
21+
22+
23+
@users.after_request
24+
def add_request_id_to_response(response):
25+
response.headers["X-Request-ID"] = g.request_id
26+
return response
27+
28+
29+
@users.route("/", methods=["GET"])
30+
@users.output(schema.GenericResponse, status_code=200)
1431
def api_get_users():
1532
pass
33+
34+
35+
@users.route("/", methods=["POST"])
36+
@users.output(schema.GenericResponse, status_code=200)
37+
def api_post_user():
38+
pass
39+
40+
41+
@users.route("/token", methods=["POST"])
42+
@users.input(schema.Authentication, location="json")
43+
@users.output(schema.GenericResponse, status_code=200)
44+
def api_post_users_token(json: dict):
45+
"""
46+
Generate an OAuth2.0 token for an existing user.
47+
48+
Returns:
49+
- A JSON response with the OAuth2.0 token.
50+
"""
51+
52+
username = json.get("username")
53+
password = json.get("password")
54+
55+
token = ""
56+
57+
if token:
58+
return {
59+
"url": request.url,
60+
"success": True,
61+
"id": g.request_id,
62+
"version": "v1",
63+
"timestamp": datetime.datetime.now(),
64+
"data": {"token": token},
65+
}, 200
66+
else:
67+
return {
68+
"url": request.url,
69+
"success": False,
70+
"id": g.request_id,
71+
"version": "v1",
72+
"timestamp": datetime.datetime.now(),
73+
"error": {"name": "Unauthorized", "msg": "Invalid username or password."},
74+
}, 401
75+
76+
77+
@users.route("/<user_id>", methods=["GET"])
78+
@users.output(schema.GenericResponse, status_code=200)
79+
def api_get_user():
80+
pass
81+
82+
83+
@users.route("/<user_id>", methods=["PATCH"])
84+
@users.output(schema.GenericResponse, status_code=200)
85+
def api_patch_user():
86+
pass
87+
88+
89+
@users.route("/<user_id>", methods=["DELETE"])
90+
@users.output(schema.GenericResponse, status_code=200)
91+
def api_delete_user():
92+
pass

app/src/schema.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import json
2+
import logging
3+
from apiflask import Schema, abort
4+
from apiflask.fields import Boolean, Integer, String, DateTime, Dict, List, URL
5+
from apiflask.validators import Length, OneOf, Regexp, Range
6+
from marshmallow import (
7+
pre_load,
8+
fields,
9+
INCLUDE,
10+
validates,
11+
post_dump,
12+
ValidationError,
13+
validate,
14+
validates_schema,
15+
)
16+
17+
__version__ = "v1"
18+
19+
20+
class GenericResponse(Schema):
21+
url = fields.URL(required=True)
22+
success = fields.Boolean(required=True)
23+
version = fields.String(required=True)
24+
timestamp = fields.DateTime(required=True)
25+
id = fields.String(required=True)
26+
27+
data = fields.Dict(required=False)
28+
error = fields.Dict(required=False)
29+
30+
class Meta:
31+
unknown = INCLUDE
32+
33+
def __init__(self, *args, **kwargs):
34+
super().__init__(*args, **kwargs)
35+
36+
def validate(self, data):
37+
"""
38+
Custom validation to ensure either 'result' or 'error' is present
39+
based on the 'success' value.
40+
"""
41+
if data.get("success"):
42+
if not data.get("data"):
43+
raise ValueError("'data' field is required when success is True.")
44+
else:
45+
if not data.get("error"):
46+
raise ValueError("'error' field is required when success is False.")
47+
return data
48+
49+
50+
class Authentication(Schema):
51+
username = fields.String(required=True)
52+
password = fields.String(required=True)

0 commit comments

Comments
 (0)