iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0

本文同步發表於: Sponge Records

上一回我們實作了密碼修改的功能,這回將會實作帳號停用的功能,來讓使用者可以刪除自己的帳號,一般情況下帳號停用不會真的刪除該筆帳號,而是在存放帳號的
資料表當中加一個欄位識別是否已停用,但我們的需求是停用後不可恢復,且之後可創立相同的帳號,所以我們使用 gorm 的 delete 將帳號密碼刪除

這裡會將架構分為 main.go 、 controllers\accountsControllers.go 、 models\accounts.go,透過 main.go 的路由呼叫 accountsControllers.go 再透過 accounts.go 執行邏輯判斷與實作

建立刪除帳號的路由

在 main.go 中增加刪除帳號的路由

//刪除帳號 api 
router.HandleFunc("/api/user/delete", controllers.DeleteAccount).Methods("POST")

建立刪除帳號功能的 controllers\accountsControllers.go

我們將會實作 controllers\accountsControllers.go 中的 DeleteEditorAccount,透過這個函數先解讀 json 格式的請求,並且驗證正確性,驗證完成後 call models\accounts.go 做事

controllers\accountsControllers.go

package controllers

import (
	"net/http"
	"encoding/json"
	"golang-api/models"
	u "golang-api/utils"
)

//刪除帳號的函數
var DeleteAccount = func(w http.ResponseWriter, r *http.Request) {

	account := &models.Account{} //引用 accounts.go
	err := json.NewDecoder(r.Body).Decode(account)//解析傳入的 json 請求

	//如果輸入的請求錯誤
	if err != nil {
		u.Respond(w, u.Message(false, "Invalid request"))
		return
	}

	resp := account.Delete() //呼叫 accounts.go 透過傳入的資料刪除帳號
	u.Respond(w, resp)
}

建立刪除帳號功能的 models\accounts.go

我們將主要的邏輯放置在這裡,models\accounts.go 會包含驗證輸入的密碼是否正確

models\accounts.go

package models

import (
	u "golang-api/utils" // 開頭的 u 代表用 u 來引用他
	"os"
	"strings"
	"github.com/dgrijalva/jwt-go"
	"github.com/jinzhu/gorm"
	"golang.org/x/crypto/bcrypt"
)


//JWT 結構
type Token struct {
	UserId uint
	jwt.StandardClaims
}

//帳號結構
type Account struct {
	gorm.Model
	Email    string `json:"email"`
	Password string `json:"Password"`  
	Token    string `json:"token";sql:"-"`
}

//帳號刪除
func (account *Account) Editor() (map[string]interface{}) {  

  account := &Account{}
  
  err := GetDB().Table("accounts").Where("email = ?", email).First(account).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return u.Message(false, "Email address not found")
		}
		return u.Message(false, "Connection error. Please retry")
	}

	err = bcrypt.CompareHashAndPassword([]byte(account.Password), []byte(password))
	if err != nil && err == bcrypt.ErrMismatchedHashAndPassword { //Password does not match!
		return u.Message(false, "pwd error")
	}
  
  //刪除
  GetDB().Delete(Account{}, "email = ?", email)

  //清空 pwd 的數值以便回傳
  account.Password = ""
  
  //刪除完成
	response := u.Message(true, "Account has been delete")
	response["account"] = account
	return response
}

下回預告

至此 api 的開發已經告一段落,下回將整理 api 的列表並且提供完整的專案供參考,由於 api 專案本身將會不斷修正改良的關係,部分程式碼可能會與文章不同
,參考請以程式碼為主


上一篇
[Day23] 會員帳號修改
下一篇
[Day25] api 結構一覽
系列文
Golang - 從打造一個 API 開始學起30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言