diff --git a/api/versions/v1/routers/roles/models.py b/api/versions/v1/routers/roles/models.py index 712cb89..a72ca3b 100644 --- a/api/versions/v1/routers/roles/models.py +++ b/api/versions/v1/routers/roles/models.py @@ -1,5 +1,6 @@ from typing import List, Optional from pydantic import BaseModel, Field +from pydantic.color import Color class RoleResponse(BaseModel): @@ -7,7 +8,7 @@ class RoleResponse(BaseModel): name: str position: int permissions: int - color: Optional[int] + color: Optional[Color] class DetailedRoleResponse(RoleResponse): @@ -16,12 +17,12 @@ class DetailedRoleResponse(RoleResponse): class NewRoleBody(BaseModel): name: str = Field(..., min_length=4, max_length=32) - color: Optional[int] = Field(None, le=0xFFFFFF, ge=0) + color: Optional[Color] = None permissions: Optional[int] = Field(0, ge=0) class UpdateRoleBody(BaseModel): - name: str = Field("", min_length=4, max_length=64) - color: Optional[int] = Field(None, le=0xFFFFFF, ge=0) + name: str = Field("", min_length=4, max_length=32) + color: Optional[Color] = None permissions: int = Field(0, ge=0) position: int = Field(0, ge=0) diff --git a/api/versions/v1/routers/roles/routes.py b/api/versions/v1/routers/roles/routes.py index 4beca11..4c7cb3d 100644 --- a/api/versions/v1/routers/roles/routes.py +++ b/api/versions/v1/routers/roles/routes.py @@ -61,7 +61,9 @@ async def fetch_role(id: int): if not record: raise HTTPException(404, "Role not found") - return dict(record) + record = dict(record) + + return record @router.post( @@ -93,7 +95,7 @@ async def create_role(body: NewRoleBody, roles=has_permissions([ManageRoles()])) try: record = await Role.pool.fetchrow( - query, body.name, body.color, body.permissions + query, body.name, int(body.color.as_hex()[1:], 16), body.permissions ) except asyncpg.exceptions.UniqueViolationError: raise HTTPException(409, "Role with that name already exists") @@ -118,6 +120,9 @@ async def update_role( body: UpdateRoleBody, roles=has_permissions([ManageRoles()]), ): + if body.color: + body.color = int(body.color.as_hex()[1:], 16) + role = await Role.fetch(id) if not role: raise HTTPException(404, "Role Not Found") diff --git a/tests/test_roles.py b/tests/test_roles.py index dfc6dc0..c32aa76 100644 --- a/tests/test_roles.py +++ b/tests/test_roles.py @@ -1,5 +1,4 @@ import pytest - from httpx import AsyncClient from api.models import Role, UserRole @@ -13,7 +12,9 @@ async def manage_roles_role(db): VALUES (create_snowflake(), $1, $2, $3, (SELECT COUNT(*) FROM roles) + 1) RETURNING *; """ - record = await Role.pool.fetchrow(query, "Roles Manager", 0x0, ManageRoles().value) + record = await Role.pool.fetchrow( + query, "Roles Manager", 0x000, ManageRoles().value + ) yield Role(**record) await db.execute("DELETE FROM roles WHERE id = $1;", record["id"]) @@ -26,11 +27,13 @@ async def manage_roles_role(db): ({}, 422), ({"name": ""}, 422), ({"permissions": -1}, 422), - ({"name": "test1", "color": 0xFFFFFFF}, 422), - ({"name": "test1", "color": -0x000001}, 422), - ({"name": "test2", "color": 0x000000, "permissions": 8}, 403), - ({"name": "test2", "color": 0x000000, "permissions": 0}, 201), - ({"name": "test2", "color": 0x000000, "permissions": 0}, 409), + ({"name": "test1", "color": "0xffffff"}, 422), + ({"name": "test1", "color": "-0x000001"}, 422), + ({"name": "test2", "color": "0x000000", "permissions": 8}, 403), + ({"name": "test2", "color": "0x000000", "permissions": 0}, 201), + ({"name": "test2", "color": "0x000000", "permissions": 0}, 409), + ({"name": "test3", "color": "black", "permissions": 0}, 201), + ({"name": "test4", "color": "#bafc03", "permissions": 0}, 201), ], ) async def test_role_create( @@ -66,31 +69,44 @@ async def test_fetch_all_roles(app: AsyncClient): @pytest.mark.parametrize( ("request_data", "new_data", "status"), [ - ({}, {"name": "test update", "permissions": 0, "color": 0}, 204), - ({"name": ""}, {"name": "test update", "permissions": 0, "color": 0}, 422), + ({}, {"name": "test update", "permissions": 0, "color": "0x000"}, 204), + ( + {"name": ""}, + {"name": "test update", "permissions": 0, "color": "0x000"}, + 422, + ), ( {"permissions": -1}, - {"name": "test update", "permissions": 0, "color": 0}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( - {"color": 0xFFFFFFF}, - {"name": "test update", "permissions": 0, "color": 0}, + {"color": "0xffffff"}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( - {"color": -0x000001}, - {"name": "test update", "permissions": 0, "color": 0}, + {"color": "-0x000001"}, + {"name": "test update", "permissions": 0, "color": "0x000"}, 422, ), ( - {"color": 0x5, "permissions": 8}, - {"name": "test update", "permissions": 0, "color": 0x0}, + {"color": "0x005", "permissions": 8}, + {"name": "test update", "permissions": 0, "color": "0x000"}, + 403, + ), + ( + {"color": "black", "permissions": 8}, + {"name": "test update", "permissions": 0, "color": "#bafc03"}, 403, ), ( - {"color": 0x5, "permissions": ManageRoles().value}, - {"name": "test update", "permissions": ManageRoles().value, "color": 0x5}, + {"color": "0x005", "permissions": ManageRoles().value}, + { + "name": "test update", + "permissions": ManageRoles().value, + "color": "0x005", + }, 204, ), ],