feat(users): add search endpoint for adding new user to workspace by mobile

This commit is contained in:
2026-03-12 08:30:14 +08:00
parent 5990114151
commit 93b1699253
4 changed files with 65 additions and 0 deletions

View File

@@ -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',
)

View File

@@ -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"),
] ]

View File

@@ -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)

View File

@@ -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):