diff --git a/services/backend/api/v1/router.py b/services/backend/api/v1/router.py index d775d37..f44c575 100644 --- a/services/backend/api/v1/router.py +++ b/services/backend/api/v1/router.py @@ -4,6 +4,7 @@ from ninja import NinjaAPI from api.v1 import handlers from api.v1.ping.views import router as ping_router +from api.v1.users.views import router as users_router router = NinjaAPI( title="project_name API", @@ -17,6 +18,10 @@ router.add_router( "ping", ping_router, ) +router.add_router( + "", + users_router, +) for exception, handler in handlers.exception_handlers: diff --git a/services/backend/api/v1/users/__init__.py b/services/backend/api/v1/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/backend/api/v1/users/schemas.py b/services/backend/api/v1/users/schemas.py new file mode 100644 index 0000000..ce41e00 --- /dev/null +++ b/services/backend/api/v1/users/schemas.py @@ -0,0 +1,20 @@ +from ninja import Schema, ModelSchema + + +from apps.users.models import User + + +class TokenSchema(Schema): + token: str + + +class RegisterSchema(ModelSchema): + class Meta: + model = User + fields = ["email", "username", "password"] + + +class LoginSchema(ModelSchema): + class Meta: + model = User + fields = ["email", "password"] diff --git a/services/backend/api/v1/users/views.py b/services/backend/api/v1/users/views.py new file mode 100644 index 0000000..41a732f --- /dev/null +++ b/services/backend/api/v1/users/views.py @@ -0,0 +1,31 @@ +from ninja import Router + +from api.v1.users.schemas import LoginSchema, RegisterSchema, TokenSchema +from api.v1.schemas import BadRequestError, ForbiddenError +from apps.users.models import User + + +router = Router(tags=["users"]) + + +@router.post( + path="/sign-up", + response={ + 201: TokenSchema, + 400: BadRequestError, + } +) +def sign_up(data: RegisterSchema): + ... + + +@router.post( + path="/sign-in", + response={ + 200: TokenSchema, + 400: BadRequestError, + 403: ForbiddenError, + } +) +def sign_in(data: LoginSchema): + ... diff --git a/services/backend/apps/users/__init__.py b/services/backend/apps/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/backend/apps/users/apps.py b/services/backend/apps/users/apps.py new file mode 100644 index 0000000..cdb5bb5 --- /dev/null +++ b/services/backend/apps/users/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.users' + label = 'users' + + diff --git a/services/backend/apps/users/migrations/__init__.py b/services/backend/apps/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/backend/apps/users/models.py b/services/backend/apps/users/models.py new file mode 100644 index 0000000..3806689 --- /dev/null +++ b/services/backend/apps/users/models.py @@ -0,0 +1,16 @@ +from django.db import models + +from apps.core.models import BaseModel + + +class User(BaseModel): + email = models.EmailField(unique=True, verbose_name="Почта") + username = models.SlugField(unique=True, verbose_name="Юзернейм") + password = models.TextField(verbose_name="Пароль") + + def __str__(self): + return self.username + + class Meta: + verbose_name = "пользователь" + verbose_name_plural = "пользователи" diff --git a/services/backend/config/settings.py b/services/backend/config/settings.py index 6e2a3b1..d19a537 100644 --- a/services/backend/config/settings.py +++ b/services/backend/config/settings.py @@ -443,6 +443,7 @@ INSTALLED_APPS = [ "minio_storage", # Internal apps "apps.core", + "apps.users", ] # GUID