이전 블로그에서는 session 정보를 이용하여 로그인 여부만 확인하여 다른 사람의 리스트도 볼 수 있는 구조임.
이번에는 session 정보를 이용하여 자신의 todo list만 볼수 있도록 샘플 코드를 수정합니다.
./model/model.go 수정 사항
// 수정전
type DBHandler interface {
// private 처리함
GetTodos() []*Todo
AddTodo(name string) *Todo
RemoveTodo(id int) bool
CompleteTodo(id int, complete bool) bool
Close()
}
// 수정후
type DBHandler interface {
// private 처리함
GetTodos(sessionId string) []*Todo
AddTodo(name, sessionId string) *Todo
RemoveTodo(id int) bool
CompleteTodo(id int, complete bool) bool
Close()
}
./model/sqliteHandler.go - 3군데 수정
// first modify
func (s *sqliteHandler) GetTodos() []*Todo {
todos := []*Todo{}
sql_string := "SELECT id, name, completed, createdAt From todos"
rows, err := s.db.Query(sql_string)
if err != nil {
panic(err)
}
func (s *sqliteHandler) GetTodos(sessionId string) []*Todo {
todos := []*Todo{}
sql_string := "SELECT id, name, completed, createdAt From todos WHERE sessionId = ?"
rows, err := s.db.Query(sql_string, sessionId)
if err != nil {
panic(err)
}
// second modify
func (s *sqliteHandler) AddTodo(name string) *Todo {
sql_string := "INSERT INTO todos (name, completed, createdAt) VALUES(?,?,datetime('now'))"
stmt, err := s.db.Prepare(sql_string)
if err != nil {
panic(err)
}
result, err := stmt.Exec(name, false)
if err != nil {
panic(err)
}
func (s *sqliteHandler) AddTodo(name, sessionId string) *Todo {
sql_string := "INSERT INTO todos (sessionId, name, completed, createdAt) VALUES(?,?,?,datetime('now'))"
stmt, err := s.db.Prepare(sql_string)
if err != nil {
panic(err)
}
result, err := stmt.Exec(sessionId, name, false)
if err != nil {
panic(err)
}
// third modify
statement, _ := database.Prepare(
`CREATE TABLE IF NOT EXISTS todos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
completed BOOLEAN,
createdAt DATETIME
)`)
statement, _ := database.Prepare(
`CREATE TABLE IF NOT EXISTS todos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sessionId STRING,
name TEXT,
completed BOOLEAN,
createdAt DATETIME
);
CREATE INDEX IF NOT EXISTS sessionIdIndexOnTodos ON todos(sessionId ASC);`)
./myapp/app.go - 4군데 수정
// first modify
func getSessionID(r *http.Request) string {
session, err := store.Get(r, "session")
if err != nil {
log.Println(err.Error())
var getSessionID = func(r *http.Request) string {
session, err := store.Get(r, "session")
if err != nil {
log.Println(err.Error())
// second modify
func (a *AppHandler) getTodoListHandler(w http.ResponseWriter, r *http.Request) {
list := a.db.GetTodos()
rd.JSON(w, http.StatusOK, list)
}
func (a *AppHandler) getTodoListHandler(w http.ResponseWriter, r *http.Request) {
sessionsId := getSessionID(r)
list := a.db.GetTodos(sessionsId)
rd.JSON(w, http.StatusOK, list)
}
// third modify
func (a *AppHandler) addTodoHandler(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("name")
todo := a.db.AddTodo(name)
rd.JSON(w, http.StatusCreated, todo)
}
func (a *AppHandler) addTodoHandler(w http.ResponseWriter, r *http.Request) {
sessionsId := getSessionID(r)
name := r.FormValue("name")
todo := a.db.AddTodo(name, sessionsId)
rd.JSON(w, http.StatusCreated, todo)
}
// forth modify
func CheckSignin(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// if request RRL is /singin.html, then next()
if strings.Contains(r.URL.Path, "/signin.html") || strings.Contains(r.URL.Path, "/auth") {
next(rw, r)
return
}
func CheckSignin(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// if request RRL is /singin.html, then next()
if strings.Contains(r.URL.Path, "/signin") || strings.Contains(r.URL.Path, "/auth") {
next(rw, r)
return
}
./myapp/app_test.go - app.go 의 getSessionID 수정 부분과 관련된 부분임
func TestTodos(t *testing.T) {
os.Remove("./test.db")
assert := assert.New(t)
appH := MakeNewHandler("./test.db")
func TestTodos(t *testing.T) {
getSessionID = func(r *http.Request) string {
return "gettestsessionId"
}
os.Remove("./test.db")
assert := assert.New(t)
appH := MakeNewHandler("./test.db")
참고자료 [유투브 링크]
'GO lang > web' 카테고리의 다른 글
[GO] Todo list - postgresql (0) | 2021.11.26 |
---|---|
[GO] Todo list - Google Oauth2 (0) | 2021.11.23 |
[GO] Todo list - sqlite (0) | 2021.11.18 |
[GO] Todo list - interface 구현2 (0) | 2021.11.18 |
[GO] Todo list - interface 구현1 (0) | 2021.11.18 |