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  // }