feat(users): add search endpoint for adding new user to workspace by mobile
This commit is contained in:
@@ -143,3 +143,15 @@ class UserProfileSerializer(BaseModelSerializer):
|
|||||||
"is_verified", "full_name", "age"
|
"is_verified", "full_name", "age"
|
||||||
)
|
)
|
||||||
read_only_fields = BaseModelSerializer.Meta.fields + ("mobile", "is_verified")
|
read_only_fields = BaseModelSerializer.Meta.fields + ("mobile", "is_verified")
|
||||||
|
|
||||||
|
|
||||||
|
class UserSearchSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
|
fields = (
|
||||||
|
'id',
|
||||||
|
'first_name',
|
||||||
|
'last_name',
|
||||||
|
'mobile',
|
||||||
|
'profile_picture',
|
||||||
|
)
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ urlpatterns = [
|
|||||||
'patch': 'partial_update',
|
'patch': 'partial_update',
|
||||||
'delete': 'destroy'
|
'delete': 'destroy'
|
||||||
}), name='user-me'),
|
}), name='user-me'),
|
||||||
|
path('search/', views.UserSearchAPIView.as_view(), name='user-search'),
|
||||||
path("token/obtain/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
|
path("token/obtain/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
|
||||||
path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
|
path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ from apps.users.api.serializers import (
|
|||||||
TokenPairSerializer,
|
TokenPairSerializer,
|
||||||
RegisterWithPasswordSerializer,
|
RegisterWithPasswordSerializer,
|
||||||
UserProfileSerializer,
|
UserProfileSerializer,
|
||||||
|
UserSearchSerializer,
|
||||||
)
|
)
|
||||||
from apps.users.services.auth import (
|
from apps.users.services.auth import (
|
||||||
register_user_with_password,
|
register_user_with_password,
|
||||||
@@ -246,3 +247,25 @@ class UserProfileViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
|
|||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
return self.request.user
|
return self.request.user
|
||||||
|
|
||||||
|
|
||||||
|
class UserSearchAPIView(APIView):
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
mobile = request.query_params.get('mobile')
|
||||||
|
if not mobile:
|
||||||
|
return Response(
|
||||||
|
{"detail": "Mobile parameter is required."},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
|
||||||
|
user = User.objects.filter(mobile=mobile).first()
|
||||||
|
if not user:
|
||||||
|
return Response(
|
||||||
|
{"detail": "User not found."},
|
||||||
|
status=status.HTTP_404_NOT_FOUND
|
||||||
|
)
|
||||||
|
|
||||||
|
serializer = UserSearchSerializer(user, context={"request": request})
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
@@ -4,13 +4,42 @@ from core.serializers.base import BaseModelSerializer
|
|||||||
from apps.workspaces.models import Workspace, WorkspaceMembership
|
from apps.workspaces.models import Workspace, WorkspaceMembership
|
||||||
|
|
||||||
|
|
||||||
|
class WorkspaceMemberInputSerializer(serializers.Serializer):
|
||||||
|
user_id = serializers.UUIDField()
|
||||||
|
role = serializers.ChoiceField(choices=WorkspaceMembership.Role.choices, default=WorkspaceMembership.Role.MEMBER)
|
||||||
|
|
||||||
|
|
||||||
class WorkspaceSerializer(BaseModelSerializer):
|
class WorkspaceSerializer(BaseModelSerializer):
|
||||||
|
members = WorkspaceMemberInputSerializer(many=True, write_only=True, required=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Workspace
|
model = Workspace
|
||||||
fields = BaseModelSerializer.Meta.fields + (
|
fields = BaseModelSerializer.Meta.fields + (
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
|
"members",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
members_data = validated_data.pop('members', [])
|
||||||
|
|
||||||
|
workspace = super().create(validated_data)
|
||||||
|
|
||||||
|
memberships_to_create = []
|
||||||
|
for member in members_data:
|
||||||
|
memberships_to_create.append(
|
||||||
|
WorkspaceMembership(
|
||||||
|
workspace=workspace,
|
||||||
|
user_id=member['user_id'],
|
||||||
|
role=member.get('role', 'member'),
|
||||||
|
is_active=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if memberships_to_create:
|
||||||
|
WorkspaceMembership.objects.bulk_create(memberships_to_create)
|
||||||
|
|
||||||
|
return workspace
|
||||||
|
|
||||||
|
|
||||||
class WorkspaceMembershipSerializer(BaseModelSerializer):
|
class WorkspaceMembershipSerializer(BaseModelSerializer):
|
||||||
|
|||||||
Reference in New Issue
Block a user