chore: checkpoint 第一版
ci / verify (push) Canceled after 0s

This commit is contained in:
Codex Local
2026-09-06 17:04:11 +08:00
parent a8cdec98d1
commit 0c2151ace9
659 changed files with 185855 additions and 554 deletions
+82 -13
View File
@@ -49,12 +49,17 @@ func CreateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
return
}
var body struct {
Model string `json:"model"`
HardwareRevision string `json:"hardware_revision"`
MinimumSecurityVersion string `json:"minimum_security_version"`
MinimumFirmwareVersion string `json:"minimum_firmware_version"`
HouseholdID string `json:"household_id"`
SubjectID string `json:"subject_id"`
Model string `json:"model"`
HardwareRevision string `json:"hardware_revision"`
MinimumSecurityVersion string `json:"minimum_security_version"`
MinimumFirmwareVersion string `json:"minimum_firmware_version"`
HouseholdID string `json:"household_id"`
SubjectID string `json:"subject_id"`
VoiceRuntime string `json:"voice_runtime"`
HardwareAgentBotID string `json:"hardware_agent_bot_id"`
HardwareAgentTransport string `json:"hardware_agent_transport"`
HardwareAgentMinimumSDKVersion string `json:"hardware_agent_minimum_sdk_version"`
InitialActivationState string `json:"activation_state"`
}
if !decodeWebJSON(w, r, &body, "设备登记参数不正确") {
return
@@ -66,6 +71,9 @@ func CreateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
result, err := service.Create(r.Context(), principal, tenantID, RequestID(r.Context()), opsdevice.CreateInput{
Model: body.Model, HardwareRevision: body.HardwareRevision, MinimumSecurityVersion: body.MinimumSecurityVersion,
MinimumFirmwareVersion: body.MinimumFirmwareVersion, HouseholdID: body.HouseholdID, SubjectID: body.SubjectID,
VoiceRuntime: body.VoiceRuntime, HardwareAgentBotID: body.HardwareAgentBotID, HardwareAgentTransport: body.HardwareAgentTransport,
HardwareAgentMinimumSDKVersion: body.HardwareAgentMinimumSDKVersion,
InitialActivationState: body.InitialActivationState,
})
if err != nil {
writeOpsDeviceError(w, r, err)
@@ -77,6 +85,57 @@ func CreateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
})
}
func TransitionOpsDeviceActivationHandler(service *opsdevice.Service) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
principal, tenantID, ok := opsDevicePrincipal(w, r)
if !ok {
return
}
if !validUUID(r.PathValue("id")) {
writeValidation(w, r, "设备编号不正确", FieldError{Field: "id", Message: "必须是UUID"})
return
}
var body struct {
TargetState string `json:"target_state"`
Reason string `json:"reason"`
ExpectedRevision int64 `json:"expected_revision"`
}
if !decodeWebJSON(w, r, &body, "激活状态迁移参数不正确") {
return
}
item, err := service.TransitionActivation(r.Context(), principal, tenantID, r.PathValue("id"), RequestID(r.Context()), opsdevice.ActivationTransitionInput{
TargetState: body.TargetState, Reason: body.Reason, ExpectedRevision: body.ExpectedRevision,
})
if err != nil {
writeOpsDeviceError(w, r, err)
return
}
w.Header().Set("ETag", concurrency.FormatETag(item.Version))
w.Header().Set("Cache-Control", "no-store")
WriteJSON(w, r, http.StatusOK, item)
})
}
func ListOpsDeviceActivationTransitionsHandler(service *opsdevice.Service) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
principal, tenantID, ok := opsDevicePrincipal(w, r)
if !ok {
return
}
if !validUUID(r.PathValue("id")) {
writeValidation(w, r, "设备编号不正确", FieldError{Field: "id", Message: "必须是UUID"})
return
}
items, err := service.ListActivationTransitions(r.Context(), principal, tenantID, r.PathValue("id"))
if err != nil {
writeOpsDeviceError(w, r, err)
return
}
w.Header().Set("Cache-Control", "no-store")
WriteJSON(w, r, http.StatusOK, map[string]any{"items": items})
})
}
func UpdateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
principal, tenantID, ok := opsDevicePrincipal(w, r)
@@ -93,13 +152,17 @@ func UpdateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
return
}
var body struct {
Model *string `json:"model"`
HardwareRevision *string `json:"hardware_revision"`
MinimumSecurityVersion *string `json:"minimum_security_version"`
MinimumFirmwareVersion *string `json:"minimum_firmware_version"`
Status *string `json:"status"`
HouseholdID *string `json:"household_id"`
SubjectID *string `json:"subject_id"`
Model *string `json:"model"`
HardwareRevision *string `json:"hardware_revision"`
MinimumSecurityVersion *string `json:"minimum_security_version"`
MinimumFirmwareVersion *string `json:"minimum_firmware_version"`
Status *string `json:"status"`
HouseholdID *string `json:"household_id"`
SubjectID *string `json:"subject_id"`
VoiceRuntime *string `json:"voice_runtime"`
HardwareAgentBotID *string `json:"hardware_agent_bot_id"`
HardwareAgentTransport *string `json:"hardware_agent_transport"`
HardwareAgentMinimumSDKVersion *string `json:"hardware_agent_minimum_sdk_version"`
}
if !decodeWebJSON(w, r, &body, "设备修改参数不正确") {
return
@@ -111,6 +174,8 @@ func UpdateOpsDeviceHandler(service *opsdevice.Service) http.Handler {
item, err := service.Update(r.Context(), principal, tenantID, r.PathValue("id"), RequestID(r.Context()), expected, opsdevice.UpdateInput{
Model: body.Model, HardwareRevision: body.HardwareRevision, MinimumSecurityVersion: body.MinimumSecurityVersion,
MinimumFirmwareVersion: body.MinimumFirmwareVersion, Status: body.Status, HouseholdID: body.HouseholdID, SubjectID: body.SubjectID,
VoiceRuntime: body.VoiceRuntime, HardwareAgentBotID: body.HardwareAgentBotID, HardwareAgentTransport: body.HardwareAgentTransport,
HardwareAgentMinimumSDKVersion: body.HardwareAgentMinimumSDKVersion,
})
if err != nil {
writeOpsDeviceError(w, r, err)
@@ -213,6 +278,10 @@ func writeOpsDeviceError(w http.ResponseWriter, r *http.Request, err error) {
WriteError(w, r, http.StatusPreconditionFailed, "VERSION_CONFLICT", "设备信息已变化,请刷新后重试")
case errors.Is(err, opsdevice.ErrClaimUnavailable):
WriteError(w, r, http.StatusConflict, "DEVICE_CLAIM_UNAVAILABLE", "只有已登记且尚未绑定的设备可以生成绑定码")
case errors.Is(err, opsdevice.ErrActivationConflict):
WriteError(w, r, http.StatusConflict, "DEVICE_ACTIVATION_CONFLICT", "设备激活状态已变化或不允许执行该迁移")
case errors.Is(err, opsdevice.ErrActivationNotReady):
WriteError(w, r, http.StatusConflict, "DEVICE_ACTIVATION_NOT_READY", "设备绑定或运行凭据尚未就绪,不能进入 ACTIVE")
default:
WriteError(w, r, http.StatusInternalServerError, "INTERNAL_ERROR", "设备管理操作失败")
}