2015-11-13 17:04:42 +08:00
|
|
|
package db
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
2015-11-21 14:39:15 +08:00
|
|
|
_ "github.com/mattn/go-sqlite3" //we want to use sqlite natively
|
2016-01-29 00:14:40 +08:00
|
|
|
md "github.com/shurcooL/github_flavored_markdown"
|
2016-01-30 01:06:49 +08:00
|
|
|
"github.com/thewhitetulip/Tasks/types"
|
2016-01-10 21:57:41 +08:00
|
|
|
"log"
|
2015-11-13 17:04:42 +08:00
|
|
|
"strings"
|
2015-11-14 18:10:21 +08:00
|
|
|
"time"
|
2015-11-13 17:04:42 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var database *sql.DB
|
|
|
|
var err error
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
database, err = sql.Open("sqlite3", "./tasks.db")
|
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//Close function closes this database connection
|
2015-11-13 17:04:42 +08:00
|
|
|
func Close() {
|
|
|
|
database.Close()
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//GetTasks retrieves all the tasks depending on the
|
|
|
|
//status pending or trashed or completed
|
2015-11-21 21:20:51 +08:00
|
|
|
func GetTasks(status string) types.Context {
|
2015-11-13 17:04:42 +08:00
|
|
|
var task []types.Task
|
2015-11-21 21:20:51 +08:00
|
|
|
var context types.Context
|
2015-11-21 14:39:15 +08:00
|
|
|
var TaskID int
|
2015-11-13 17:04:42 +08:00
|
|
|
var TaskTitle string
|
|
|
|
var TaskContent string
|
2015-11-14 18:10:21 +08:00
|
|
|
var TaskCreated time.Time
|
2016-01-23 21:47:34 +08:00
|
|
|
var TaskPriority string
|
2015-11-13 17:04:42 +08:00
|
|
|
var getTasksql string
|
2015-11-21 21:20:51 +08:00
|
|
|
|
2016-01-23 21:47:34 +08:00
|
|
|
basicSQL := "select id, title, content, created_date, priority from task "
|
2015-11-14 18:56:53 +08:00
|
|
|
if status == "pending" {
|
2016-01-23 21:47:34 +08:00
|
|
|
getTasksql = basicSQL + " where finish_date is null and is_deleted='N' order by priority desc, created_date asc"
|
2015-11-21 21:20:51 +08:00
|
|
|
} else if status == "deleted" {
|
2016-01-23 21:47:34 +08:00
|
|
|
getTasksql = basicSQL + " where is_deleted='Y' order by priority desc, created_date asc"
|
2015-11-21 21:20:51 +08:00
|
|
|
} else if status == "completed" {
|
2016-01-23 21:47:34 +08:00
|
|
|
getTasksql = basicSQL + " where finish_date is not null order by priority desc, created_date asc"
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
rows, err := database.Query(getTasksql)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
defer rows.Close()
|
2015-11-13 21:11:30 +08:00
|
|
|
for rows.Next() {
|
2016-01-23 21:47:34 +08:00
|
|
|
err := rows.Scan(&TaskID, &TaskTitle, &TaskContent, &TaskCreated, &TaskPriority)
|
2016-01-29 00:14:40 +08:00
|
|
|
TaskContent = string(md.Markdown([]byte(TaskContent)))
|
|
|
|
// TaskContent = strings.Replace(TaskContent, "\n", "<br>", -1)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
2015-11-14 18:10:21 +08:00
|
|
|
TaskCreated = TaskCreated.Local()
|
2016-01-23 21:47:34 +08:00
|
|
|
a := types.Task{Id: TaskID, Title: TaskTitle, Content: TaskContent, Created: TaskCreated.Format(time.UnixDate)[0:20], Priority: TaskPriority}
|
2015-11-13 17:04:42 +08:00
|
|
|
task = append(task, a)
|
|
|
|
}
|
2015-11-21 21:20:51 +08:00
|
|
|
context = types.Context{Tasks: task, Navigation: status}
|
|
|
|
return context
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
|
2015-11-22 11:51:29 +08:00
|
|
|
//GetTaskByID function gets the tasks from the ID passed to the function, used to populate EditTask
|
2015-11-22 10:59:39 +08:00
|
|
|
func GetTaskByID(id int) types.Context {
|
|
|
|
var tasks []types.Task
|
2015-11-13 17:04:42 +08:00
|
|
|
var task types.Task
|
2016-01-23 21:47:34 +08:00
|
|
|
|
|
|
|
getTasksql := "select id, title, content, priority from task where id=?"
|
2015-11-13 17:04:42 +08:00
|
|
|
|
|
|
|
rows, err := database.Query(getTasksql, id)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
defer rows.Close()
|
2015-11-13 21:11:30 +08:00
|
|
|
if rows.Next() {
|
2016-01-23 21:47:34 +08:00
|
|
|
err := rows.Scan(&task.Id, &task.Title, &task.Content, &task.Priority)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2016-01-23 21:47:34 +08:00
|
|
|
//send email to respective people
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
}
|
2015-11-22 10:59:39 +08:00
|
|
|
tasks = append(tasks, task)
|
|
|
|
context := types.Context{Tasks: tasks, Navigation: "edit"}
|
|
|
|
return context
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//TrashTask is used to delete the task
|
2015-11-14 18:56:53 +08:00
|
|
|
func TrashTask(id int) error {
|
2015-11-21 14:39:15 +08:00
|
|
|
trashSQL, err := database.Prepare("update task set is_deleted='Y',last_modified_at=datetime() where id=?")
|
2015-11-14 18:56:53 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-14 18:56:53 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-14 18:56:53 +08:00
|
|
|
}
|
2015-11-21 14:39:15 +08:00
|
|
|
_, err = tx.Stmt(trashSQL).Exec(id)
|
2015-11-14 18:56:53 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println("doing rollback")
|
2015-11-14 18:56:53 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//CompleteTask is used to mark tasks as complete
|
2015-11-14 18:56:53 +08:00
|
|
|
func CompleteTask(id int) error {
|
2015-11-13 17:04:42 +08:00
|
|
|
stmt, err := database.Prepare("update task set is_deleted='Y', finish_date=datetime(),last_modified_at=datetime() where id=?")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
_, err = tx.Stmt(stmt).Exec(id)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//DeleteAll is used to empty the trash
|
2015-11-13 17:04:42 +08:00
|
|
|
func DeleteAll() error {
|
|
|
|
stmt, err := database.Prepare("delete from task where is_deleted='Y'")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
_, err = tx.Stmt(stmt).Exec()
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println("doing rollback")
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//RestoreTask is used to restore tasks from the Trash
|
2015-11-13 17:04:42 +08:00
|
|
|
func RestoreTask(id int) error {
|
2015-11-21 14:39:15 +08:00
|
|
|
restoreSQL, err := database.Prepare("update task set is_deleted='N',last_modified_at=datetime() where id=?")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
2015-11-21 14:39:15 +08:00
|
|
|
_, err = tx.Stmt(restoreSQL).Exec(id)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println("doing rollback")
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2016-01-09 13:18:11 +08:00
|
|
|
//RestoreTask is used to restore tasks from the Trash
|
2016-01-09 13:03:35 +08:00
|
|
|
func RestoreTaskFromComplete(id int) error {
|
2016-01-09 13:18:11 +08:00
|
|
|
restoreSQL, err := database.Prepare("update task set finish_date=null,last_modified_at=datetime() where id=?")
|
2016-01-09 13:03:35 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2016-01-09 13:03:35 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2016-01-09 13:03:35 +08:00
|
|
|
}
|
|
|
|
_, err = tx.Stmt(restoreSQL).Exec(id)
|
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println("doing rollback")
|
2016-01-09 13:03:35 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//DeleteTask is used to delete the task from the database
|
2015-11-13 17:04:42 +08:00
|
|
|
func DeleteTask(id int) error {
|
|
|
|
deleteSQL, err := database.Prepare("delete from task where id = ?")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
_, err = tx.Stmt(deleteSQL).Exec(id)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//AddTask is used to add the task in the database
|
2016-01-23 21:47:34 +08:00
|
|
|
func AddTask(title, content string, taskPriority int) error {
|
2016-01-28 23:13:52 +08:00
|
|
|
restoreSQL, err := database.Prepare("insert into task(title, content, priority, created_date, last_modified_at) values(?,?,?,datetime(), datetime())")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
2016-01-23 21:47:34 +08:00
|
|
|
_, err = tx.Stmt(restoreSQL).Exec(title, content, taskPriority)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
|
|
|
tx.Commit()
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//UpdateTask is used to update the tasks in the database
|
2015-11-13 21:11:30 +08:00
|
|
|
func UpdateTask(id int, title string, content string) error {
|
2015-11-21 14:39:15 +08:00
|
|
|
SQL, err := database.Prepare("update task set title=?, content=? where id=?")
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
tx, err := database.Begin()
|
|
|
|
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
2015-11-21 14:39:15 +08:00
|
|
|
_, err = tx.Stmt(SQL).Exec(title, content, id)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
tx.Rollback()
|
|
|
|
} else {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(tx.Commit())
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2015-11-21 14:39:15 +08:00
|
|
|
//SearchTask is used to return the search results depending on the query
|
2015-11-21 22:12:20 +08:00
|
|
|
func SearchTask(query string) types.Context {
|
2015-11-21 19:03:34 +08:00
|
|
|
stmt := "select id, title, content, created_date from task where title like '%" + query + "%' or content like '%" + query + "%'"
|
2015-11-13 17:04:42 +08:00
|
|
|
var task []types.Task
|
2015-11-21 14:39:15 +08:00
|
|
|
var TaskID int
|
2015-11-13 17:04:42 +08:00
|
|
|
var TaskTitle string
|
|
|
|
var TaskContent string
|
2015-11-21 19:03:34 +08:00
|
|
|
var TaskCreated time.Time
|
2015-11-21 22:12:20 +08:00
|
|
|
var context types.Context
|
2015-11-13 17:04:42 +08:00
|
|
|
|
|
|
|
rows, err := database.Query(stmt, query, query)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
2015-11-13 21:11:30 +08:00
|
|
|
for rows.Next() {
|
2015-11-21 19:03:34 +08:00
|
|
|
err := rows.Scan(&TaskID, &TaskTitle, &TaskContent, &TaskCreated)
|
2015-11-13 21:11:30 +08:00
|
|
|
if err != nil {
|
2016-01-09 13:18:11 +08:00
|
|
|
log.Println(err)
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|
|
|
|
TaskTitle = strings.Replace(TaskTitle, query, "<span class='highlight'>"+query+"</span>", -1)
|
|
|
|
TaskContent = strings.Replace(TaskContent, query, "<span class='highlight'>"+query+"</span>", -1)
|
2016-01-29 00:14:40 +08:00
|
|
|
TaskContent = string(md.Markdown([]byte(TaskContent)))
|
2015-11-21 19:03:34 +08:00
|
|
|
a := types.Task{Id: TaskID, Title: TaskTitle, Content: TaskContent, Created: TaskCreated.Format(time.UnixDate)[0:20]}
|
2015-11-13 17:04:42 +08:00
|
|
|
task = append(task, a)
|
|
|
|
}
|
2015-11-21 22:12:20 +08:00
|
|
|
context = types.Context{Tasks: task, Search: query}
|
|
|
|
return context
|
2015-11-13 17:04:42 +08:00
|
|
|
}
|