본문 바로가기

GO lang/web

[GO] Todo list - session 별 데이터 관리

이전 블로그에서는 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