-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Replace the current store from file system to sqlite
- Loading branch information
1 parent
04f739e
commit 4d24658
Showing
12 changed files
with
338 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
package data | ||
|
||
import ( | ||
"database/sql" | ||
"log" | ||
) | ||
|
||
func InitDb(db *sql.DB) { | ||
createUsersTable(db) | ||
seedUsersTable(db) | ||
createTasksTable(db) | ||
seedTasksTable(db) | ||
} | ||
|
||
func createTasksTable(db *sql.DB) { | ||
_, err := db.Exec(` | ||
create table tasks ( | ||
id integer primary key autoincrement, | ||
title text not null | ||
) | ||
`) | ||
if err != nil { | ||
log.Fatalln("failed creating the tasks table:", err) | ||
} | ||
} | ||
|
||
func createUsersTable(db *sql.DB) { | ||
_, err := db.Exec(` | ||
create table users ( | ||
id integer primary key autoincrement, | ||
name text not null, | ||
email text not null unique, | ||
password text not null | ||
) | ||
`) | ||
if err != nil { | ||
log.Fatalln("failed creating the users table:", err) | ||
} | ||
} | ||
|
||
func seedUsersTable(db *sql.DB) { | ||
_, err := db.Exec(` | ||
insert into users (name, email, password) | ||
values | ||
('Claude Aldric', '[email protected]', 'Caput Draconis') | ||
`) | ||
if err != nil { | ||
log.Fatalln("failed seeding the users table:", err) | ||
} | ||
|
||
_, err = db.Exec(` | ||
insert into users (name, email, password) | ||
values | ||
('John Doe', '[email protected]', 'password') | ||
`) | ||
if err != nil { | ||
log.Fatalln("failed seeding the users table:", err) | ||
} | ||
} | ||
|
||
func seedTasksTable(db *sql.DB) { | ||
_, err := db.Exec(` | ||
insert into tasks (title) | ||
values | ||
('This is the first task') | ||
`) | ||
if err != nil { | ||
log.Fatalln("failed seeding the users table:", err) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
package data | ||
|
||
import ( | ||
"database/sql" | ||
|
||
"github.com/claudealdric/go-todolist-restful-api-server/models" | ||
"golang.org/x/crypto/bcrypt" | ||
) | ||
|
||
type SqliteStore struct { | ||
db *sql.DB | ||
} | ||
|
||
func NewSqliteStore(db *sql.DB) *SqliteStore { | ||
s := SqliteStore{db} | ||
return &s | ||
} | ||
|
||
func (s *SqliteStore) CreateTask(dto *models.CreateTaskDTO) (*models.Task, error) { | ||
result, err := s.db.Exec(` | ||
insert into tasks (title) | ||
values | ||
(?) | ||
`, dto.Title) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
taskId, err := result.LastInsertId() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return models.NewTask(int(taskId), dto.Title), nil | ||
} | ||
|
||
func (s *SqliteStore) CreateUser(dto *models.CreateUserDTO) (*models.User, error) { | ||
hashedPassword, err := bcrypt.GenerateFromPassword( | ||
[]byte(dto.Password), | ||
bcrypt.DefaultCost, | ||
) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
result, err := s.db.Exec(` | ||
insert into users (name, email, password) | ||
values | ||
(?, ?, ?) | ||
`, dto.Name, dto.Email, hashedPassword) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
userId, err := result.LastInsertId() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return models.NewUser(int(userId), dto.Name, dto.Email, dto.Password), nil | ||
} | ||
|
||
func (s *SqliteStore) DeleteTaskById(id int) error { | ||
_, err := s.db.Exec(` | ||
delete from tasks where id = ? | ||
`, id) | ||
return err | ||
} | ||
|
||
func (s *SqliteStore) GetTaskById(id int) (*models.Task, error) { | ||
var task models.Task | ||
err := s.db.QueryRow(`select * from tasks where id = ?`, id).Scan( | ||
&task.Id, | ||
&task.Title, | ||
) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return &task, nil | ||
} | ||
|
||
func (s *SqliteStore) GetTasks() ([]models.Task, error) { | ||
rows, err := s.db.Query(`select * from tasks`) | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer rows.Close() | ||
var tasks []models.Task | ||
for rows.Next() { | ||
var task models.Task | ||
err := rows.Scan(&task.Id, &task.Title) | ||
if err != nil { | ||
return nil, err | ||
} | ||
tasks = append(tasks, task) | ||
} | ||
return tasks, nil | ||
} | ||
|
||
func (s *SqliteStore) GetUsers() ([]models.User, error) { | ||
rows, err := s.db.Query(`select * from users`) | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer rows.Close() | ||
var users []models.User | ||
for rows.Next() { | ||
var user models.User | ||
err := rows.Scan(&user.Id, &user.Name, &user.Email, &user.Password) | ||
if err != nil { | ||
return nil, err | ||
} | ||
users = append(users, user) | ||
} | ||
return users, nil | ||
} | ||
|
||
func (s *SqliteStore) GetUserByEmail(email string) (*models.User, error) { | ||
var user models.User | ||
err := s.db.QueryRow(`select * from users where email = ?`, email).Scan( | ||
&user.Id, | ||
&user.Name, | ||
&user.Email, | ||
&user.Password, | ||
) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return &user, nil | ||
} | ||
|
||
func (s *SqliteStore) UpdateTask(task *models.Task) (*models.Task, error) { | ||
_, err := s.db.Exec(` | ||
update tasks | ||
set title = ? | ||
where id = ? | ||
`, task.Title, task.Id) | ||
if err != nil { | ||
return nil, err | ||
} | ||
updatedTask, err := s.GetTaskById(task.Id) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return updatedTask, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.