Skip to content

Commit 054d333

Browse files
committed
Add some routes for group
1 parent 3564024 commit 054d333

File tree

7 files changed

+90
-4
lines changed

7 files changed

+90
-4
lines changed

flemi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def register_extensions(app: Flask) -> None:
5151

5252

5353
def register_blueprints(app: Flask) -> None:
54-
for mod_name in ("auth", "me", "post", "user"):
54+
for mod_name in ("auth", "me", "post", "user", "group"):
5555
mod = il.import_module(f".api.{mod_name}.views", "flemi")
5656
blueprint = getattr(mod, f"{mod_name}_bp")
5757
CORS(blueprint)

flemi/api/group/__init__.py

Whitespace-only changes.

flemi/api/group/schemas.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from apiflask import Schema
2+
from apiflask.fields import Boolean
3+
from apiflask.fields import Integer
4+
from apiflask.fields import List
5+
from apiflask.fields import Nested
6+
from apiflask.fields import String
7+
8+
from ..user.schemas import PublicUserOutSchema
9+
10+
11+
class GroupInSchema(Schema):
12+
name = String(required=True)
13+
members = List(Integer())
14+
private = Boolean()
15+
16+
17+
class GroupOutSchema(Schema):
18+
name = String()
19+
members = List(Nested(PublicUserOutSchema))
20+
manager = Nested(PublicUserOutSchema)
21+
private = Boolean()

flemi/api/group/views.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from apiflask import APIBlueprint
2+
from flask import request
3+
4+
from ...models import Group
5+
from ..auth.views import auth
6+
from ..auth.views import verify_token
7+
from .schemas import GroupOutSchema
8+
9+
group_bp = APIBlueprint("group", __name__, url_prefix="/group")
10+
11+
12+
@group_bp.get("/all")
13+
@group_bp.output(GroupOutSchema(many=True))
14+
def all():
15+
token = request.headers.get("Authorization", "")
16+
public_groups = Group.query.filter_by(private=False).all()
17+
18+
try:
19+
token = token[7:]
20+
user = verify_token(token)
21+
except IndexError:
22+
return public_groups
23+
24+
if user is None:
25+
return public_groups
26+
else:
27+
return [g for g in Group.query.all() if not g.private or user in g.members]
28+
29+
30+
@group_bp.get("/me")
31+
@group_bp.auth_required(auth)
32+
@group_bp.output(GroupOutSchema(many=True))
33+
def me():
34+
return auth.current_user.groups

flemi/api/me/schemas.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from marshmallow.fields import Url
77

88

9-
class PrivateUserOutputSchema(Schema):
9+
class PrivateUserOutSchema(Schema):
1010
avatar_url = Function(lambda obj: obj.avatar_url())
1111

1212
class Meta:

flemi/api/me/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
from .schemas import AboutEditSchema
77
from .schemas import AvatarEditSchema
88
from .schemas import BasicProfileEditSchema
9-
from .schemas import PrivateUserOutputSchema
9+
from .schemas import PrivateUserOutSchema
1010

1111

1212
me_bp = APIBlueprint("me", __name__, url_prefix="/me")
1313

1414

1515
@me_bp.get("")
1616
@me_bp.auth_required(auth)
17-
@me_bp.output(PrivateUserOutputSchema)
17+
@me_bp.output(PrivateUserOutSchema)
1818
def self_profile():
1919
"""
2020
profile of the current user

tests/test_group.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from flemi.models import db, Group
2+
from .base import Base
3+
4+
5+
class GroupTestCase(Base):
6+
def setUp(self) -> None:
7+
super().setUp()
8+
self.set_headers()
9+
10+
def test_all_groups(self):
11+
g = Group(name="test")
12+
g2 = Group(name="test2", members=[self.test_user], private=True)
13+
db.session.add(g)
14+
db.session.add(g2)
15+
db.session.commit()
16+
17+
resp = self.client.get(
18+
"/group/all",
19+
)
20+
data = resp.get_json()
21+
self.assertEqual(resp.status_code, 200)
22+
self.assertEqual(data[0]["name"], "test")
23+
self.assertTrue(len(data) == 1)
24+
25+
resp = self.client.get(
26+
"/group/all",
27+
headers=self.headers
28+
)
29+
data = resp.get_json()
30+
print(len(data))
31+
self.assertTrue(len(data) == 2)

0 commit comments

Comments
 (0)