You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gcgj-dify-1.7.0/api/controllers/service_api_with_auth/user/profile.py

130 lines
4.2 KiB
Python

import re
from flask import request
from flask_restful import Resource # type: ignore
from controllers.service_api_with_auth import api
from controllers.service_api_with_auth.wraps import validate_user_token_and_extract_info
from models.model import App, EndUser
from services.end_user_service import EndUserService
class UserProfile(Resource):
@validate_user_token_and_extract_info
def get(self, app_model: App, end_user: EndUser):
"""Get user profile.
---
tags:
- service/profile
summary: Get profile
description: Get current user's profile information
security:
- ApiKeyAuth: []
responses:
200:
description: Profile retrieved successfully
schema:
type: object
properties:
username:
type: string
gender:
type: string
enum: [male, female, unknown]
major:
type: string
email:
type: string
format: email
401:
description: Invalid or missing token
"""
# Use the service to get user profile
profile = EndUserService.get_user_profile(end_user.external_user_id)
return profile
@validate_user_token_and_extract_info
def put(self, app_model: App, end_user: EndUser):
"""Update user profile.
---
tags:
- service/profile
summary: Update profile
description: Update user profile information
security:
- ApiKeyAuth: []
parameters:
- name: body
in: body
required: true
schema:
type: object
properties:
username:
type: string
maxLength: 10
pattern: ^[a-zA-Z\u4e00-\u9fa5]+$
description: Username (Chinese or English only)
gender:
type: string
enum: [male, female, unknown]
major:
type: string
maxLength: 50
responses:
200:
description: Profile updated successfully
schema:
type: object
properties:
success:
type: boolean
example: true
400:
description: Invalid profile data
401:
description: Invalid or missing token
"""
data = request.get_json()
validated_data = {}
# Validate username if provided
if "username" in data:
username = data["username"]
# Validate username (Chinese or English only, max 10 chars)
if not re.match(r"^[a-zA-Z\u4e00-\u9fa5]+$", username) or len(username) > 10:
return {"success": False, "message": "Invalid username format"}, 400
validated_data["username"] = username
# Validate gender if provided
if "gender" in data:
gender_str = data["gender"]
if gender_str not in ["unknown", "male", "female"]:
return {"success": False, "message": "Invalid gender value"}, 400
validated_data["gender"] = gender_str
# Validate major if provided
if "major" in data:
major = data["major"]
# Allow None as a valid value (to clear the field)
if major is None:
validated_data["major"] = None
elif not isinstance(major, str):
return {"success": False, "message": "Major must be a string value or null"}, 400
elif len(major) > 50:
return {"success": False, "message": "Major exceeds maximum length of 50"}, 400
else:
validated_data["major"] = major
# Use the service to update user profile
success, error = EndUserService.update_user_profile(end_user, validated_data)
if not success:
return {"success": False, "message": error or "Failed to update profile"}, 500
return {"success": True}
api.add_resource(UserProfile, "/user/profile")