github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/sqlstore/task_store.go (about) 1 // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package sqlstore 5 6 import ( 7 "database/sql" 8 "net/http" 9 // "strings" 10 // "time" 11 "strconv" 12 13 "github.com/xzl8028/xenia-server/einterfaces" 14 "github.com/xzl8028/xenia-server/model" 15 "github.com/xzl8028/xenia-server/store" 16 ) 17 18 // task is a subset of the model.Task type, omitting the model.User fields. 19 type task struct { 20 TaskId int `json:"task_id"` 21 CreateAt int64 `json:"create_at"` 22 DueAt int64 `json:"due_at"` 23 ConfirmAt int64 `json:"confirm_at"` 24 FinishAt int64 `json:"finish_at"` 25 SendDept string `json:"send_dept"` 26 ReceiveDept string `json:"receive_dept"` 27 RoomId int `json:"room_id"` 28 TaskType string `json:"task_type"` 29 Note string `json:"note"` 30 Status int `json:"status"` 31 TeamId string `json:"teamid"` 32 PostId string `json:"postid"` 33 } 34 35 func taskFromModel(t *model.Task) *task { 36 return &task{ 37 TaskId: t.TaskId, 38 CreateAt: t.CreateAt, 39 DueAt: t.DueAt, 40 ConfirmAt: t.ConfirmAt, 41 FinishAt: t.FinishAt, 42 SendDept: t.SendDept, 43 ReceiveDept: t.ReceiveDept, 44 RoomId: t.RoomId, 45 TaskType: t.TaskType, 46 Note: t.Note, 47 Status: t.Status, 48 TeamId: t.TeamId, 49 PostId: t.PostId, 50 51 } 52 } 53 54 // SqlTaskStore is a store for managing tasks in the database. 55 // Tasks are otherwise normal users with extra metadata record in the Tasks table. The primary key 56 // for a task matches the primary key value for corresponding User record. 57 type SqlTaskStore struct { 58 SqlStore 59 metrics einterfaces.MetricsInterface 60 } 61 62 // NewSqlTaskStore creates an instance of SqlTaskStore, registering the table schema in question. 63 func NewSqlTaskStore(sqlStore SqlStore, metrics einterfaces.MetricsInterface) store.TaskStore { 64 us := &SqlTaskStore{ 65 SqlStore: sqlStore, 66 metrics: metrics, 67 } 68 69 for _, db := range sqlStore.GetAllConns() { 70 table := db.AddTableWithName(task{}, "Tasks").SetKeys(true, "TaskId") 71 table.ColMap("TaskId").SetMaxSize(200) 72 table.ColMap("CreateAt").SetMaxSize(200) 73 table.ColMap("DueAt").SetMaxSize(200) 74 table.ColMap("ConfirmAt").SetMaxSize(200) 75 table.ColMap("FinishAt").SetMaxSize(200) 76 table.ColMap("SendDept").SetMaxSize(200) 77 table.ColMap("ReceiveDept").SetMaxSize(200) 78 table.ColMap("RoomId").SetMaxSize(200) 79 table.ColMap("TaskType").SetMaxSize(200) 80 table.ColMap("Note").SetMaxSize(200) 81 table.ColMap("Status").SetMaxSize(200) 82 table.ColMap("TeamId").SetMaxSize(200) 83 table.ColMap("PostId").SetMaxSize(200) 84 } 85 86 return us 87 } 88 89 // func (us SqlTaskStore) CreateIndexesIfNotExists() { 90 // } 91 92 // traceTask is a helper function for adding to a task trace when logging. 93 func traceTask(task *model.Task, extra map[string]interface{}) map[string]interface{} { 94 trace := make(map[string]interface{}) 95 for key, value := range task.Trace() { 96 trace[key] = value 97 } 98 for key, value := range extra { 99 trace[key] = value 100 } 101 102 return trace 103 } 104 105 // Get fetches the given task in the database. 106 func (us SqlTaskStore) Get(taskId string) (*model.Task, *model.AppError) { 107 // var excludeDeletedSql = "AND b.DeleteAt = 0" 108 // if includeDeleted { 109 // excludeDeletedSql = "" 110 // } 111 112 query := ` 113 SELECT * FROM Tasks 114 WHERE TaskId =`+taskId 115 116 var task *model.Task 117 if err := us.GetReplica().SelectOne(&task, query); err == sql.ErrNoRows { 118 return nil, model.MakeTaskNotFoundError(taskId) 119 } else if err != nil { 120 return nil, model.NewAppError("SqlTaskStore.Get", "store.sql_task.get.app_error", map[string]interface{}{"task_id": taskId}, err.Error(), http.StatusInternalServerError) 121 } 122 123 // var task *model.Task 124 // if err := us.GetReplica().SelectOne(&task, sql); /*err == sql.ErrNoRows { 125 // result.Err = model.MakeTaskNotFoundError(taskId) 126 // } else if*/ err != nil { 127 // result.Err = model.NewAppError("SqlTaskStore.GetTask", "store.sql_task.get.app_error", $ 128 // } //else { 129 // result.Data = task 130 // // } 131 132 return task, nil 133 } 134 135 136 // GetAll fetches from all tasks in the database. 137 func (us SqlTaskStore) GetAll() ([]*model.Task, *model.AppError) { 138 // params := map[string]interface{}{ 139 // "offset": options.Page * options.PerPage, 140 // "limit": options.PerPage, 141 // } 142 143 // var conditions []string 144 // var conditionsSql string 145 // var additionalJoin string 146 147 // if !options.IncludeDeleted { 148 // conditions = append(conditions, "b.DeleteAt = 0") 149 // } 150 // if options.OwnerId != "" { 151 // conditions = append(conditions, "b.OwnerId = :creator_id") 152 // params["creator_id"] = options.OwnerId 153 // } 154 // if options.OnlyOrphaned { 155 // additionalJoin = "JOIN Users o ON (o.Id = b.OwnerId)" 156 // conditions = append(conditions, "o.DeleteAt != 0") 157 // } 158 159 // if len(conditions) > 0 { 160 // conditionsSql = "WHERE " + strings.Join(conditions, " AND ") 161 // } 162 163 query := ` 164 SELECT * FROM Tasks 165 ` 166 167 var tasks []*model.Task 168 if _, err := us.GetReplica().Select(&tasks, query); err != nil { 169 return nil, model.NewAppError("SqlTaskStore.GetAll", "store.sql_task.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) 170 } 171 172 return tasks, nil 173 } 174 175 176 //For task center plugin 177 func (us SqlTaskStore) GetAllWithTeamId(teamId string) ([]*model.Task, *model.AppError) { 178 179 // params := map[string]interface{}{ 180 // "offset": options.Page * options.PerPage, 181 // "limit": options.PerPage, 182 // } 183 184 // var conditions []string 185 // var conditionsSql string 186 // var additionalJoin string 187 188 // if !options.IncludeDeleted { 189 // conditions = append(conditions, "b.DeleteAt = 0") 190 // } 191 // if options.OwnerId != "" { 192 // conditions = append(conditions, "b.OwnerId = :creator_id") 193 // params["creator_id"] = options.OwnerId 194 // } 195 // if options.OnlyOrphaned { 196 // additionalJoin = "JOIN Users o ON (o.Id = b.OwnerId)" 197 // conditions = append(conditions, "o.DeleteAt != 0") 198 // } 199 200 // if len(conditions) > 0 { 201 // conditionsSql = "WHERE " + strings.Join(conditions, " AND ") 202 // } 203 204 query := ` 205 SELECT * FROM Tasks WHERE TeamId = :TeamId 206 ` 207 208 var tasks []*model.Task 209 if _, err := us.GetReplica().Select(&tasks, query,map[string]interface{}{"TeamId":teamId}); err != nil { 210 return nil, model.NewAppError("SqlTaskStore.GetAll", "store.sql_task.get_all.app_error", nil, err.Error(), http.StatusInternalServerError) 211 } 212 213 return tasks, nil 214 } 215 216 217 218 // // Save persists a new task to the database. 219 // // It assumes the corresponding user was saved via the user store. 220 // func (us SqlTaskStore) Save(task *model.Task) (*model.Task, *model.AppError) { 221 // task = task.Clone() 222 // task.PreSave() 223 224 // if err := task.IsValid(); err != nil { 225 // return nil, err 226 // } 227 228 // if err := us.GetMaster().Insert(taskFromModel(task)); err != nil { 229 // return nil, model.NewAppError("SqlTaskStore.Save", "store.sql_task.save.app_error", task.Trace(), err.Error(), http.StatusInternalServerError) 230 // } 231 232 // return task, nil 233 // } 234 235 // Update persists an updated task to the database. 236 // It assumes the corresponding user was updated via the user store. 237 func (us SqlTaskStore) Update(task *model.Task) (*model.Task, *model.AppError) { 238 // task = task.Clone() 239 240 // task.PreUpdate() 241 // if err := task.IsValid(); err != nil { 242 // return nil, err 243 // } 244 245 // oldTask, err := us.Get(task.TaskId, true) 246 // if err != nil { 247 // return nil, err 248 // } 249 250 // oldTask.CreateAt = task.CreateAt 251 // oldTask.DueAt = task.DueAt 252 // oldTask.ConfirmAt = task.ConfirmAt 253 // oldTask.FinishAt = task.FinishAt 254 // oldTask.SendDept = task.SendDept 255 // oldTask.ReceiveDept = task.ReceiveDept 256 // oldTask.RoomId = task.RoomId 257 // oldTask.TaskType = task.TaskType 258 // oldTask.Note = task.Note 259 // oldTask.Status = task.Status 260 // task = oldTask 261 262 // if count, err := us.GetMaster().Update(taskFromModel(task)); err != nil { 263 // return nil, model.NewAppError("SqlTaskStore.Update", "store.sql_task.update.updating.app_error", task.Trace(), err.Error(), http.StatusInternalServerError) 264 // } else if count != 1 { 265 // return nil, model.NewAppError("SqlTaskStore.Update", "store.sql_task.update.app_error", traceTask(task, map[string]interface{}{"count": count}), "", http.StatusInternalServerError) 266 // } 267 268 if _, err := us.GetMaster().Exec("UPDATE Tasks SET CreateAt = :CreateAt, DueAt = :DueAt, ConfirmAt = :ConfirmAt, FinishAt = :FinishAt, SendDept = :SendDept, ReceiveDept = :ReceiveDept, RoomId = :RoomId, TaskType = :TaskType, Note = :Note, Status = :Status, TeamId = :TeamId, PostId = :PostId WHERE TaskId = :TaskId", map[string]interface{}{"TaskId": task.TaskId, "CreateAt": task.CreateAt, "DueAt": task.DueAt, "ConfirmAt": task.ConfirmAt, "FinishAt": task.FinishAt, "SendDept": task.SendDept, "ReceiveDept": task.ReceiveDept, "RoomId": task.RoomId, "TaskType": task.TaskType, "Note": task.Note, "Status": task.Status, "TeamId": task.TeamId, "PostId": task.PostId}); err != nil { 269 return nil, model.NewAppError("SqlTaskStore.Update", "store.sql_task.update.app_error", nil, "task_id="+strconv.Itoa(task.TaskId), http.StatusInternalServerError) 270 } 271 272 return task, nil 273 } 274 275 func (us SqlTaskStore) Insert(task *model.Task) (*model.Task, *model.AppError) { 276 277 if res, err := us.GetMaster().Exec("INSERT INTO Tasks (CreateAt, DueAt, ConfirmAt, FinishAt, SendDept, ReceiveDept, RoomId, TaskType, Note, Status,TeamId,PostId) VALUES (:CreateAt, :DueAt, :ConfirmAt, :FinishAt, :SendDept, :ReceiveDept, :RoomId, :TaskType, :Note, :Status, :TeamId, :PostId);", map[string]interface{}{"CreateAt": task.CreateAt, "DueAt": task.DueAt, "ConfirmAt": task.ConfirmAt, "FinishAt": task.FinishAt, "SendDept": task.SendDept, "ReceiveDept": task.ReceiveDept, "RoomId": task.RoomId, "TaskType": task.TaskType, "Note": task.Note, "Status": task.Status,"TeamId": task.TeamId, "PostId": task.PostId}); err != nil { 278 return nil, model.NewAppError("SqlTaskStore.Insert", "store.sql_task.insert.app_error", nil, "", http.StatusInternalServerError) 279 } else { 280 id, err := res.LastInsertId() 281 if err != nil { 282 println("Error!") 283 } else { 284 println("LastInsertId:", id) 285 task.TaskId = int(id) 286 } 287 } 288 289 return task, nil 290 } 291 292 293 294 // // PermanentDelete removes the task from the database altogether. 295 // // If the corresponding user is to be deleted, it must be done via the user store. 296 // func (us SqlTaskStore) PermanentDelete(taskUserId string) *model.AppError { 297 // query := "DELETE FROM Tasks WHERE UserId = :user_id" 298 // if _, err := us.GetMaster().Exec(query, map[string]interface{}{"user_id": taskUserId}); err != nil { 299 // return model.NewAppError("SqlTaskStore.Update", "store.sql_task.delete.app_error", map[string]interface{}{"user_id": taskUserId}, err.Error(), http.StatusBadRequest) 300 // } 301 // return nil 302 // }