feat: 添加数据模型和存储层

- model: JobTemplate、SubmitJobRequest、JobHistoryQuery 等模型定义

- store: NewGormDB MySQL 连接池,使用 zap 日志替代 GORM 默认日志

- store: TemplateStore CRUD 操作,支持 GORM AutoMigrate

- NewGormDB 接受 gormLevel 参数,由上层传入配置值

- 完整 TDD 测试覆盖

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
dailz
2026-04-10 08:39:30 +08:00
parent f7a21ee455
commit fbfd5c5f42
9 changed files with 506 additions and 0 deletions

47
internal/model/job.go Normal file
View File

@@ -0,0 +1,47 @@
package model
// SubmitJobRequest is the API request for submitting a job.
type SubmitJobRequest struct {
Script string `json:"script" binding:"required"`
Partition string `json:"partition,omitempty"`
QOS string `json:"qos,omitempty"`
CPUs int32 `json:"cpus,omitempty"`
Memory string `json:"memory,omitempty"`
TimeLimit string `json:"time_limit,omitempty"`
JobName string `json:"job_name,omitempty"`
Environment map[string]string `json:"environment,omitempty"`
}
// JobResponse is the simplified API response for a job.
type JobResponse struct {
JobID int32 `json:"job_id"`
Name string `json:"name"`
State []string `json:"job_state"`
Partition string `json:"partition"`
SubmitTime *int64 `json:"submit_time,omitempty"`
StartTime *int64 `json:"start_time,omitempty"`
EndTime *int64 `json:"end_time,omitempty"`
ExitCode *int32 `json:"exit_code,omitempty"`
Nodes string `json:"nodes,omitempty"`
}
// JobListResponse is the paginated response for job listings.
type JobListResponse struct {
Jobs []JobResponse `json:"jobs"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}
// JobHistoryQuery contains query parameters for job history.
type JobHistoryQuery struct {
Users string `form:"users" json:"users,omitempty"`
StartTime string `form:"start_time" json:"start_time,omitempty"`
EndTime string `form:"end_time" json:"end_time,omitempty"`
Account string `form:"account" json:"account,omitempty"`
Partition string `form:"partition" json:"partition,omitempty"`
State string `form:"state" json:"state,omitempty"`
JobName string `form:"job_name" json:"job_name,omitempty"`
Page int `form:"page,default=1" json:"page,omitempty"`
PageSize int `form:"page_size,default=20" json:"page_size,omitempty"`
}