Просмотр исходного кода

feat(user): 新增用户绑定关系功能

- 创建用户绑定关系表 t_user_binding 及其索引和外键约束
- 实现用户绑定控制器 UserBindingController 提供 RESTful 接口
- 定义用户绑定类型枚举 UserBindingType 支持医生和家属两种类型
- 添加 MyBatis 类型处理器 UserBindingTypeHandler 处理枚举映射
- 创建实体类 UserBinding 和相关 VO 对象支持数据传输
- 实现服务层 UserBindingService 及其实现类处理业务逻辑
- 支持创建、删除、分页查询及检查用户绑定关系的功能
mcbaiyun 1 месяц назад
Родитель
Сommit
bdf543125d

+ 20 - 0
docs/DataBase/t_user_binding.txt

@@ -0,0 +1,20 @@
+CREATE TABLE `t_user_binding` (
+  `id` BIGINT NOT NULL COMMENT '主键ID',
+  `patient_user_id` BIGINT NOT NULL COMMENT '患者用户ID',
+  `bound_user_id` BIGINT NOT NULL COMMENT '被绑定用户ID(医生或家属)',
+  `binding_type` VARCHAR(20) NOT NULL COMMENT '绑定类型(DOCTOR-医生, FAMILY-家属)',
+  `status` TINYINT DEFAULT 1 COMMENT '绑定状态(1-有效,0-无效)',
+  `create_user` BIGINT COMMENT '创建者ID',
+  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_user` BIGINT COMMENT '更新者ID',
+  `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  `version` INT DEFAULT 0 COMMENT '乐观锁版本号',
+  `remark` VARCHAR(255) COMMENT '备注',
+  PRIMARY KEY (`id`),
+  KEY `idx_patient_bound` (`patient_user_id`, `bound_user_id`),
+  KEY `idx_patient_user` (`patient_user_id`),
+  KEY `idx_bound_user` (`bound_user_id`),
+  KEY `idx_binding_type` (`binding_type`),
+  CONSTRAINT `fk_binding_patient` FOREIGN KEY (`patient_user_id`) REFERENCES `t_user_info` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `fk_binding_bound` FOREIGN KEY (`bound_user_id`) REFERENCES `t_user_info` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户绑定关系表';

+ 83 - 0
src/main/java/work/baiyun/chronicdiseaseapp/controller/UserBindingController.java

@@ -0,0 +1,83 @@
+package work.baiyun.chronicdiseaseapp.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import work.baiyun.chronicdiseaseapp.common.R;
+import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.UserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CreateUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.DeleteUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.service.UserBindingService;
+
+@RestController
+@RequestMapping("/user-binding")
+@Tag(name = "用户绑定 (User Binding)", description = "用户绑定关系相关接口")
+public class UserBindingController {
+
+    @Autowired
+    private UserBindingService userBindingService;
+
+    @Operation(summary = "创建用户绑定关系", description = "创建患者与医生或家属的绑定关系")
+    @PostMapping(path = "/create", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> create(@RequestBody CreateUserBindingRequest req) {
+        try {
+            userBindingService.createUserBinding(req);
+            return R.success(200, "ok");
+        } catch (Exception e) {
+            return R.fail(500, e.getMessage());
+        }
+    }
+
+    @Operation(summary = "删除用户绑定关系", description = "解除患者与医生或家属的绑定关系")
+    @PostMapping(path = "/delete", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> delete(@RequestBody DeleteUserBindingRequest req) {
+        try {
+            userBindingService.deleteUserBinding(req.getPatientUserId(), req.getBoundUserId());
+            return R.success(200, "ok");
+        } catch (Exception e) {
+            return R.fail(500, e.getMessage());
+        }
+    }
+
+    @Operation(summary = "分页查询患者的绑定关系列表", description = "根据患者ID和绑定类型查询绑定关系列表")
+    @PostMapping(path = "/list-by-patient", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> listByPatient(Long patientUserId, String bindingType, @RequestBody BaseQueryRequest req) {
+        try {
+            Page<UserBindingResponse> page = userBindingService.listBindingsByPatient(patientUserId, bindingType, req);
+            return R.success(200, "ok", page);
+        } catch (Exception e) {
+            return R.fail(500, e.getMessage());
+        }
+    }
+
+    @Operation(summary = "分页查询用户被绑定的关系列表", description = "根据被绑定用户ID和绑定类型查询被绑定关系列表")
+    @PostMapping(path = "/list-by-bound-user", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> listByBoundUser(Long boundUserId, String bindingType, @RequestBody BaseQueryRequest req) {
+        try {
+            Page<UserBindingResponse> page = userBindingService.listBindingsByBoundUser(boundUserId, bindingType, req);
+            return R.success(200, "ok", page);
+        } catch (Exception e) {
+            return R.fail(500, e.getMessage());
+        }
+    }
+
+    @Operation(summary = "检查用户绑定关系", description = "检查患者与医生或家属是否存在绑定关系")
+    @PostMapping(path = "/check", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> check(@RequestBody CheckUserBindingRequest req) {
+        try {
+            CheckUserBindingResponse response = userBindingService.checkUserBinding(req);
+            return R.success(200, "ok", response);
+        } catch (Exception e) {
+            return R.fail(500, e.getMessage());
+        }
+    }
+}

+ 41 - 0
src/main/java/work/baiyun/chronicdiseaseapp/enums/UserBindingType.java

@@ -0,0 +1,41 @@
+package work.baiyun.chronicdiseaseapp.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * 用户绑定类型枚举
+ */
+public enum UserBindingType {
+    DOCTOR("DOCTOR", "医生"),
+    FAMILY("FAMILY", "家属");
+
+    @EnumValue
+    private final String code;
+    private final String description;
+
+    UserBindingType(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return description;
+    }
+
+    public static UserBindingType fromCode(String code) {
+        if (code == null) return null;
+        for (UserBindingType type : UserBindingType.values()) {
+            if (type.code.equals(code)) return type;
+        }
+        throw new IllegalArgumentException("Unknown UserBindingType code: " + code);
+    }
+}

+ 41 - 0
src/main/java/work/baiyun/chronicdiseaseapp/handler/UserBindingTypeHandler.java

@@ -0,0 +1,41 @@
+package work.baiyun.chronicdiseaseapp.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import work.baiyun.chronicdiseaseapp.enums.UserBindingType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@MappedJdbcTypes(JdbcType.VARCHAR)
+@MappedTypes(UserBindingType.class)
+public class UserBindingTypeHandler extends BaseTypeHandler<UserBindingType> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, UserBindingType parameter, JdbcType jdbcType) throws SQLException {
+        ps.setString(i, parameter.getCode());
+    }
+
+    @Override
+    public UserBindingType getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String code = rs.getString(columnName);
+        return code == null ? null : UserBindingType.fromCode(code);
+    }
+
+    @Override
+    public UserBindingType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String code = rs.getString(columnIndex);
+        return code == null ? null : UserBindingType.fromCode(code);
+    }
+
+    @Override
+    public UserBindingType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String code = cs.getString(columnIndex);
+        return code == null ? null : UserBindingType.fromCode(code);
+    }
+}

+ 10 - 0
src/main/java/work/baiyun/chronicdiseaseapp/mapper/UserBindingMapper.java

@@ -0,0 +1,10 @@
+package work.baiyun.chronicdiseaseapp.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import work.baiyun.chronicdiseaseapp.model.po.UserBinding;
+
+@Mapper
+public interface UserBindingMapper extends BaseMapper<UserBinding> {
+
+}

+ 30 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/po/UserBinding.java

@@ -0,0 +1,30 @@
+package work.baiyun.chronicdiseaseapp.model.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import work.baiyun.chronicdiseaseapp.enums.UserBindingType;
+
+@Schema(description = "用户绑定关系表")
+@TableName("t_user_binding")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class UserBinding extends BaseEntity {
+    @Schema(description = "患者用户ID")
+    @TableField("patient_user_id")
+    private Long patientUserId;
+
+    @Schema(description = "被绑定用户ID(医生或家属)")
+    @TableField("bound_user_id")
+    private Long boundUserId;
+
+    @Schema(description = "绑定类型(DOCTOR-医生, FAMILY-家属)")
+    @TableField(value = "binding_type", typeHandler = work.baiyun.chronicdiseaseapp.handler.UserBindingTypeHandler.class)
+    private UserBindingType bindingType;
+
+    @Schema(description = "绑定状态(1-有效,0-无效)")
+    @TableField("status")
+    private Integer status;
+}

+ 18 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/CheckUserBindingRequest.java

@@ -0,0 +1,18 @@
+package work.baiyun.chronicdiseaseapp.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "检查用户绑定关系请求")
+@Data
+public class CheckUserBindingRequest {
+
+    @Schema(description = "患者用户ID")
+    @NotNull(message = "患者用户ID不能为空")
+    private Long patientUserId;
+
+    @Schema(description = "被绑定用户ID(医生或家属)")
+    @NotNull(message = "被绑定用户ID不能为空")
+    private Long boundUserId;
+}

+ 15 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/CheckUserBindingResponse.java

@@ -0,0 +1,15 @@
+package work.baiyun.chronicdiseaseapp.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "检查用户绑定关系响应")
+@Data
+public class CheckUserBindingResponse {
+
+    @Schema(description = "是否存在绑定关系")
+    private Boolean exists;
+
+    @Schema(description = "绑定类型(DOCTOR-医生, FAMILY-家属)")
+    private String bindingType;
+}

+ 22 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/CreateUserBindingRequest.java

@@ -0,0 +1,22 @@
+package work.baiyun.chronicdiseaseapp.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "创建用户绑定关系请求")
+@Data
+public class CreateUserBindingRequest {
+
+    @Schema(description = "患者用户ID")
+    @NotNull(message = "患者用户ID不能为空")
+    private Long patientUserId;
+
+    @Schema(description = "被绑定用户ID(医生或家属)")
+    @NotNull(message = "被绑定用户ID不能为空")
+    private Long boundUserId;
+
+    @Schema(description = "绑定类型(DOCTOR-医生, FAMILY-家属)")
+    @NotNull(message = "绑定类型不能为空")
+    private String bindingType;
+}

+ 18 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/DeleteUserBindingRequest.java

@@ -0,0 +1,18 @@
+package work.baiyun.chronicdiseaseapp.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "删除用户绑定关系请求")
+@Data
+public class DeleteUserBindingRequest {
+
+    @Schema(description = "患者用户ID")
+    @NotNull(message = "患者用户ID不能为空")
+    private Long patientUserId;
+
+    @Schema(description = "被绑定用户ID(医生或家属)")
+    @NotNull(message = "被绑定用户ID不能为空")
+    private Long boundUserId;
+}

+ 29 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/UserBindingResponse.java

@@ -0,0 +1,29 @@
+package work.baiyun.chronicdiseaseapp.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "用户绑定关系响应")
+@Data
+public class UserBindingResponse {
+
+    @Schema(description = "记录ID")
+    private String id;
+
+    @Schema(description = "患者用户ID")
+    private Long patientUserId;
+
+    @Schema(description = "被绑定用户ID(医生或家属)")
+    private Long boundUserId;
+
+    @Schema(description = "绑定类型(DOCTOR-医生, FAMILY-家属)")
+    private String bindingType;
+
+    @Schema(description = "绑定状态(1-有效,0-无效)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+}

+ 35 - 0
src/main/java/work/baiyun/chronicdiseaseapp/service/UserBindingService.java

@@ -0,0 +1,35 @@
+package work.baiyun.chronicdiseaseapp.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.UserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CreateUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingRequest;
+
+public interface UserBindingService {
+    /**
+     * 创建用户绑定关系
+     */
+    void createUserBinding(CreateUserBindingRequest request);
+
+    /**
+     * 删除用户绑定关系
+     */
+    void deleteUserBinding(Long patientUserId, Long boundUserId);
+
+    /**
+     * 分页查询患者的绑定关系列表
+     */
+    Page<UserBindingResponse> listBindingsByPatient(Long patientUserId, String bindingType, BaseQueryRequest request);
+
+    /**
+     * 分页查询用户被绑定的关系列表
+     */
+    Page<UserBindingResponse> listBindingsByBoundUser(Long boundUserId, String bindingType, BaseQueryRequest request);
+
+    /**
+     * 检查绑定关系是否存在
+     */
+    CheckUserBindingResponse checkUserBinding(CheckUserBindingRequest request);
+}

+ 148 - 0
src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserBindingServiceImpl.java

@@ -0,0 +1,148 @@
+package work.baiyun.chronicdiseaseapp.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import work.baiyun.chronicdiseaseapp.mapper.UserBindingMapper;
+import work.baiyun.chronicdiseaseapp.model.po.UserBinding;
+import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.UserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CreateUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingResponse;
+import work.baiyun.chronicdiseaseapp.model.vo.CheckUserBindingRequest;
+import work.baiyun.chronicdiseaseapp.service.UserBindingService;
+import work.baiyun.chronicdiseaseapp.enums.UserBindingType;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class UserBindingServiceImpl implements UserBindingService {
+
+    @Autowired
+    private UserBindingMapper userBindingMapper;
+
+    @Override
+    public void createUserBinding(CreateUserBindingRequest request) {
+        // 检查是否已存在绑定关系
+        QueryWrapper<UserBinding> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("patient_user_id", request.getPatientUserId())
+                .eq("bound_user_id", request.getBoundUserId());
+        UserBinding existing = userBindingMapper.selectOne(queryWrapper);
+        
+        if (existing != null) {
+            // 如果已存在,则更新状态为有效
+            existing.setStatus(1);
+            userBindingMapper.updateById(existing);
+        } else {
+            // 如果不存在,则创建新的绑定关系
+            UserBinding userBinding = new UserBinding();
+            BeanUtils.copyProperties(request, userBinding);
+            userBinding.setStatus(1); // 默认状态为有效
+            userBindingMapper.insert(userBinding);
+        }
+    }
+
+    @Override
+    public void deleteUserBinding(Long patientUserId, Long boundUserId) {
+        QueryWrapper<UserBinding> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("patient_user_id", patientUserId)
+                .eq("bound_user_id", boundUserId);
+        UserBinding existing = userBindingMapper.selectOne(queryWrapper);
+        
+        if (existing != null) {
+            // 软删除,将状态设置为无效
+            existing.setStatus(0);
+            userBindingMapper.updateById(existing);
+        }
+    }
+
+    @Override
+    public Page<UserBindingResponse> listBindingsByPatient(Long patientUserId, String bindingType, BaseQueryRequest request) {
+        Page<UserBinding> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<UserBinding> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserBinding::getPatientUserId, patientUserId)
+                .eq(UserBinding::getStatus, 1) // 只查询有效的绑定关系
+                .ge(request.getStartTime() != null, UserBinding::getCreateTime, request.getStartTime())
+                .le(request.getEndTime() != null, UserBinding::getCreateTime, request.getEndTime());
+        
+        if (bindingType != null && !bindingType.isEmpty()) {
+            wrapper.eq(UserBinding::getBindingType, UserBindingType.fromCode(bindingType));
+        }
+        
+        wrapper.orderByDesc(UserBinding::getCreateTime);
+
+        Page<UserBinding> result = userBindingMapper.selectPage(page, wrapper);
+
+        List<UserBindingResponse> responses = result.getRecords().stream().map(r -> {
+            UserBindingResponse resp = new UserBindingResponse();
+            BeanUtils.copyProperties(r, resp);
+            resp.setId(r.getId().toString());
+            if (r.getBindingType() != null) {
+                resp.setBindingType(r.getBindingType().getCode());
+            }
+            return resp;
+        }).collect(Collectors.toList());
+
+        Page<UserBindingResponse> responsePage = new Page<>();
+        responsePage.setRecords(responses);
+        responsePage.setCurrent(result.getCurrent());
+        responsePage.setSize(result.getSize());
+        responsePage.setTotal(result.getTotal());
+        return responsePage;
+    }
+
+    @Override
+    public Page<UserBindingResponse> listBindingsByBoundUser(Long boundUserId, String bindingType, BaseQueryRequest request) {
+        Page<UserBinding> page = new Page<>(request.getPageNum(), request.getPageSize());
+        LambdaQueryWrapper<UserBinding> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserBinding::getBoundUserId, boundUserId)
+                .eq(UserBinding::getStatus, 1) // 只查询有效的绑定关系
+                .ge(request.getStartTime() != null, UserBinding::getCreateTime, request.getStartTime())
+                .le(request.getEndTime() != null, UserBinding::getCreateTime, request.getEndTime());
+        
+        if (bindingType != null && !bindingType.isEmpty()) {
+            wrapper.eq(UserBinding::getBindingType, UserBindingType.fromCode(bindingType));
+        }
+        
+        wrapper.orderByDesc(UserBinding::getCreateTime);
+
+        Page<UserBinding> result = userBindingMapper.selectPage(page, wrapper);
+
+        List<UserBindingResponse> responses = result.getRecords().stream().map(r -> {
+            UserBindingResponse resp = new UserBindingResponse();
+            BeanUtils.copyProperties(r, resp);
+            resp.setId(r.getId().toString());
+            if (r.getBindingType() != null) {
+                resp.setBindingType(r.getBindingType().getCode());
+            }
+            return resp;
+        }).collect(Collectors.toList());
+
+        Page<UserBindingResponse> responsePage = new Page<>();
+        responsePage.setRecords(responses);
+        responsePage.setCurrent(result.getCurrent());
+        responsePage.setSize(result.getSize());
+        responsePage.setTotal(result.getTotal());
+        return responsePage;
+    }
+
+    @Override
+    public CheckUserBindingResponse checkUserBinding(CheckUserBindingRequest request) {
+        QueryWrapper<UserBinding> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("patient_user_id", request.getPatientUserId())
+                .eq("bound_user_id", request.getBoundUserId())
+                .eq("status", 1); // 只检查有效的绑定关系
+        UserBinding existing = userBindingMapper.selectOne(queryWrapper);
+        
+        CheckUserBindingResponse response = new CheckUserBindingResponse();
+        response.setExists(existing != null);
+        if (existing != null && existing.getBindingType() != null) {
+            response.setBindingType(existing.getBindingType().getCode());
+        }
+        return response;
+    }
+}