update users table with unique tag

This commit is contained in:
steven 2021-12-12 14:00:25 +08:00
parent 9db1f57307
commit b20741cca8
8 changed files with 103 additions and 20 deletions

View file

@ -29,6 +29,16 @@ func handleUserSignUp(w http.ResponseWriter, r *http.Request) {
return return
} }
usernameUsable, _ := store.CheckUsernameUsable(userSignup.Username)
if !usernameUsable {
json.NewEncoder(w).Encode(Response{
Succeed: false,
Message: "Username is existed",
Data: nil,
})
return
}
user, err := store.CreateNewUser(userSignup.Username, userSignup.Password, "", "") user, err := store.CreateNewUser(userSignup.Username, userSignup.Password, "", "")
if err != nil { if err != nil {
@ -65,7 +75,16 @@ func handleUserSignIn(w http.ResponseWriter, r *http.Request) {
user, err := store.GetUserByUsernameAndPassword(userSignin.Username, userSignin.Password) user, err := store.GetUserByUsernameAndPassword(userSignin.Username, userSignin.Password)
if err != nil { if err != nil {
if err == sql.ErrNoRows {
json.NewEncoder(w).Encode(Response{
Succeed: false,
Message: "Username and password not allowed",
Data: nil,
})
} else {
e.ErrorHandler(w, "DATABASE_ERROR", err.Error()) e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
}
return return
} }
@ -202,8 +221,9 @@ func handleGithubAuthCallback(w http.ResponseWriter, r *http.Request) {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
username := githubUser.Name username := githubUser.Name
usernameUsable, _ := store.CheckUsernameUsable(username) usernameUsable, _ := store.CheckUsernameUsable(username)
if !usernameUsable { for !usernameUsable {
username = username + common.GenUUID() username = githubUser.Name + common.GenUUID()
usernameUsable, _ = store.CheckUsernameUsable(username)
} }
user, _ = store.CreateNewUser(username, username, githubUser.Login, "") user, _ = store.CreateNewUser(username, username, githubUser.Login, "")
} }

View file

@ -37,6 +37,42 @@ func handleUpdateMyUserInfo(w http.ResponseWriter, r *http.Request) {
return return
} }
if *userPatch.Username != "" {
usernameUsable, _ := store.CheckUsernameUsable(*userPatch.Username)
if !usernameUsable {
json.NewEncoder(w).Encode(Response{
Succeed: false,
Message: "Username is existed",
Data: nil,
})
return
}
}
if *userPatch.GithubName != "" {
githubNameUsable, _ := store.CheckGithubNameUsable(*userPatch.GithubName)
if !githubNameUsable {
json.NewEncoder(w).Encode(Response{
Succeed: false,
Message: "GitHub name is existed",
Data: nil,
})
return
}
}
if *userPatch.WxOpenId != "" {
wxOpenIdUsable, _ := store.CheckWxOpenIdUsable(*userPatch.GithubName)
if !wxOpenIdUsable {
json.NewEncoder(w).Encode(Response{
Succeed: false,
Message: "Wx open id is existed",
Data: nil,
})
return
}
}
user, err := store.UpdateUser(userId, &userPatch) user, err := store.UpdateUser(userId, &userPatch)
if err != nil { if err != nil {

View file

@ -29,7 +29,8 @@ CREATE TABLE `users` (
`github_name` TEXT DEFAULT '', `github_name` TEXT DEFAULT '',
`wx_open_id` TEXT DEFAULT '', `wx_open_id` TEXT DEFAULT '',
`created_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, `created_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP `updated_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE(`username`, `github_name`, `wx_open_id`)
); );
INSERT INTO `users` INSERT INTO `users`

Binary file not shown.

View file

@ -133,6 +133,23 @@ func CheckGithubNameUsable(githubName string) (bool, error) {
} }
} }
func CheckWxOpenIdUsable(wxOpenId string) (bool, error) {
query := `SELECT * FROM users WHERE wx_open_id=?`
query = fmt.Sprintf("SELECT COUNT(*) FROM (%s)", query)
var count uint
err := DB.QueryRow(query, wxOpenId).Scan(&count)
if err != nil && err != sql.ErrNoRows {
return false, FormatDBError(err)
}
if count > 0 {
return false, nil
} else {
return true, nil
}
}
func CheckPasswordValid(id string, password string) (bool, error) { func CheckPasswordValid(id string, password string) (bool, error) {
query := `SELECT * FROM users WHERE id=? AND password=?` query := `SELECT * FROM users WHERE id=? AND password=?`
query = fmt.Sprintf("SELECT COUNT(*) FROM (%s)", query) query = fmt.Sprintf("SELECT COUNT(*) FROM (%s)", query)

View file

@ -6,7 +6,7 @@ type ResponseType<T = unknown> = {
data: T; data: T;
}; };
async function request<T>(method: string, url: string, data?: BasicType): Promise<ResponseType<T>> { async function request<T>(method: string, url: string, data?: any): Promise<ResponseType<T>> {
const requestConfig: RequestInit = { const requestConfig: RequestInit = {
method, method,
}; };
@ -55,13 +55,15 @@ namespace api {
return request<boolean>("POST", "/api/user/validpassword", { password }); return request<boolean>("POST", "/api/user/validpassword", { password });
} }
export function updateUserinfo(username?: string, password?: string, githubName?: string, wxOpenId?: string) { interface UserInfoPatch {
return request("PATCH", "/api/user/me", { username?: string;
username, password?: string;
password, githubName?: string;
githubName, wxOpenId?: string;
wxOpenId, }
});
export function updateUserinfo(userinfo: UserInfoPatch) {
return request("PATCH", "/api/user/me", userinfo);
} }
export function getMyMemos() { export function getMyMemos() {

View file

@ -4,7 +4,6 @@ import { validate, ValidatorConfig } from "../helpers/validator";
import useLoading from "../hooks/useLoading"; import useLoading from "../hooks/useLoading";
import { locationService, userService } from "../services"; import { locationService, userService } from "../services";
import Only from "../components/common/OnlyWhen"; import Only from "../components/common/OnlyWhen";
import showAboutSiteDialog from "../components/AboutSiteDialog";
import toastHelper from "../components/Toast"; import toastHelper from "../components/Toast";
import "../less/signin.less"; import "../less/signin.less";
@ -50,8 +49,8 @@ const Signin: React.FC<Props> = () => {
setPassword(text); setPassword(text);
}; };
const handleAboutBtnClick = () => { const handleSignUpBtnClick = async () => {
showAboutSiteDialog(); toastHelper.info("注册已关闭");
}; };
const handleSignInBtnClick = async () => { const handleSignInBtnClick = async () => {
@ -186,7 +185,7 @@ const Signin: React.FC<Props> = () => {
</button> </button>
<span className="split-text">/</span> <span className="split-text">/</span>
<button className="btn signup-btn disabled" onClick={() => toastHelper.info("注册已关闭")}> <button className="btn signup-btn" onClick={handleSignUpBtnClick}>
</button> </button>
<span className="split-text">/</span> <span className="split-text">/</span>

View file

@ -35,11 +35,15 @@ class UserService {
} }
public async updateUsername(username: string): Promise<void> { public async updateUsername(username: string): Promise<void> {
await api.updateUserinfo(username); await api.updateUserinfo({
username,
});
} }
public async removeGithubName(): Promise<void> { public async removeGithubName(): Promise<void> {
await api.updateUserinfo(undefined, undefined, ""); await api.updateUserinfo({
githubName: "",
});
} }
public async checkPasswordValid(password: string): Promise<boolean> { public async checkPasswordValid(password: string): Promise<boolean> {
@ -48,11 +52,15 @@ class UserService {
} }
public async updatePassword(password: string): Promise<void> { public async updatePassword(password: string): Promise<void> {
await api.updateUserinfo(undefined, password); await api.updateUserinfo({
password,
});
} }
public async updateWxOpenId(wxOpenId: string): Promise<void> { public async updateWxOpenId(wxOpenId: string): Promise<void> {
await api.updateUserinfo(undefined, undefined, undefined, wxOpenId); await api.updateUserinfo({
wxOpenId,
});
} }
} }