Files
user_service/deploy/api/api_delete/main.go
2025-10-09 18:19:57 +08:00

146 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"github.com/gin-gonic/gin"
_ "github.com/lib/pq"
)
// DeleteAccountRequest 删除账号请求参数
type DeleteAccountRequest struct {
UserID string `json:"user_id" binding:"required"`
}
// DeleteAccountResponse 删除账号响应结构
type DeleteAccountResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
}
var db *sql.DB
func main() {
log.Println("开始初始化应用程序")
// 初始化Gin引擎
r := gin.Default()
log.Println("Gin引擎初始化完成")
// 从环境变量获取数据库配置
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")
dbUser := os.Getenv("DB_USER")
dbPassword := os.Getenv("DB_PASSWORD")
dbName := os.Getenv("DB_NAME")
log.Printf("加载数据库配置: host=%s, port=%s, user=%s, dbname=%s",
dbHost, dbPort, dbUser, dbName)
// 构建数据库连接字符串
connStr := fmt.Sprintf(
"host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
dbHost, dbPort, dbUser, dbPassword, dbName,
)
log.Println("数据库连接字符串构建完成")
var err error
db, err = sql.Open("postgres", connStr)
if err != nil {
log.Panicf("无法连接数据库: %v", err)
}
defer func() {
log.Println("关闭数据库连接")
if err := db.Close(); err != nil {
log.Printf("关闭数据库连接出错: %v", err)
}
}()
log.Println("数据库连接对象创建成功")
// 验证数据库连接
if err := db.Ping(); err != nil {
log.Panicf("数据库连接失败: %v", err)
}
log.Println("数据库连接验证成功")
// 注册删除账号接口
r.POST("/user/delete/account", deleteAccountHandler)
log.Println("已注册删除账号接口: POST /user/delete/account")
// 启动服务监听80端口
log.Println("服务启动在80端口")
if err := r.Run(":80"); err != nil {
log.Panicf("服务启动失败: %v", err)
}
}
// deleteAccountHandler 处理账号删除逻辑(逻辑删除)
func deleteAccountHandler(c *gin.Context) {
reqID := c.Request.Header.Get("X-Request-ID")
if reqID == "" {
reqID = fmt.Sprintf("req-%d", gin.Mode())
}
log.Printf("[%s] 收到删除账号请求客户端IP: %s", reqID, c.ClientIP())
var req DeleteAccountRequest
// 绑定并验证请求参数
if err := c.ShouldBindJSON(&req); err != nil {
log.Printf("[%s] 请求参数绑定失败: %v", reqID, err)
c.JSON(http.StatusBadRequest, DeleteAccountResponse{
Success: false,
Message: "请求参数错误: " + err.Error(),
})
return
}
log.Printf("[%s] 请求参数绑定成功用户ID: %s", reqID, req.UserID)
// 更新用户表中的deleted字段为true
updateQuery := `
UPDATE "user"
SET deleted = true
WHERE id = $1 AND deleted = false
`
log.Printf("[%s] 执行更新SQL: %s参数: %s", reqID, updateQuery, req.UserID)
result, err := db.Exec(updateQuery, req.UserID)
if err != nil {
log.Printf("[%s] 执行更新操作失败: %v", reqID, err)
c.JSON(http.StatusInternalServerError, DeleteAccountResponse{
Success: false,
Message: "删除账号失败: " + err.Error(),
})
return
}
log.Printf("[%s] 更新操作执行完成", reqID)
// 检查是否有记录被更新
rowsAffected, err := result.RowsAffected()
if err != nil {
log.Printf("[%s] 获取影响行数失败: %v", reqID, err)
c.JSON(http.StatusInternalServerError, DeleteAccountResponse{
Success: false,
Message: "检查删除结果失败: " + err.Error(),
})
return
}
log.Printf("[%s] 更新操作影响行数: %d", reqID, rowsAffected)
if rowsAffected == 0 {
log.Printf("[%s] 未找到可删除的用户记录用户ID: %s", reqID, req.UserID)
c.JSON(http.StatusOK, DeleteAccountResponse{
Success: false,
Message: "用户不存在或已被删除",
})
return
}
// 删除成功
log.Printf("[%s] 账号删除成功用户ID: %s", reqID, req.UserID)
c.JSON(http.StatusOK, DeleteAccountResponse{
Success: true,
Message: "账号删除成功。",
})
}