mirror of
https://github.com/usememos/memos.git
synced 2024-09-20 06:25:56 +08:00
update users table with unique tag
This commit is contained in:
parent
9db1f57307
commit
b20741cca8
26
api/auth.go
26
api/auth.go
|
@ -29,6 +29,16 @@ func handleUserSignUp(w http.ResponseWriter, r *http.Request) {
|
|||
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, "", "")
|
||||
|
||||
if err != nil {
|
||||
|
@ -65,7 +75,16 @@ func handleUserSignIn(w http.ResponseWriter, r *http.Request) {
|
|||
user, err := store.GetUserByUsernameAndPassword(userSignin.Username, userSignin.Password)
|
||||
|
||||
if err != nil {
|
||||
e.ErrorHandler(w, "DATABASE_ERROR", err.Error())
|
||||
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())
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -202,8 +221,9 @@ func handleGithubAuthCallback(w http.ResponseWriter, r *http.Request) {
|
|||
if err == sql.ErrNoRows {
|
||||
username := githubUser.Name
|
||||
usernameUsable, _ := store.CheckUsernameUsable(username)
|
||||
if !usernameUsable {
|
||||
username = username + common.GenUUID()
|
||||
for !usernameUsable {
|
||||
username = githubUser.Name + common.GenUUID()
|
||||
usernameUsable, _ = store.CheckUsernameUsable(username)
|
||||
}
|
||||
user, _ = store.CreateNewUser(username, username, githubUser.Login, "")
|
||||
}
|
||||
|
|
36
api/user.go
36
api/user.go
|
@ -37,6 +37,42 @@ func handleUpdateMyUserInfo(w http.ResponseWriter, r *http.Request) {
|
|||
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)
|
||||
|
||||
if err != nil {
|
||||
|
|
|
@ -29,7 +29,8 @@ CREATE TABLE `users` (
|
|||
`github_name` TEXT DEFAULT '',
|
||||
`wx_open_id` TEXT DEFAULT '',
|
||||
`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`
|
||||
|
|
Binary file not shown.
|
@ -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) {
|
||||
query := `SELECT * FROM users WHERE id=? AND password=?`
|
||||
query = fmt.Sprintf("SELECT COUNT(*) FROM (%s)", query)
|
||||
|
|
|
@ -6,7 +6,7 @@ type ResponseType<T = unknown> = {
|
|||
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 = {
|
||||
method,
|
||||
};
|
||||
|
@ -55,13 +55,15 @@ namespace api {
|
|||
return request<boolean>("POST", "/api/user/validpassword", { password });
|
||||
}
|
||||
|
||||
export function updateUserinfo(username?: string, password?: string, githubName?: string, wxOpenId?: string) {
|
||||
return request("PATCH", "/api/user/me", {
|
||||
username,
|
||||
password,
|
||||
githubName,
|
||||
wxOpenId,
|
||||
});
|
||||
interface UserInfoPatch {
|
||||
username?: string;
|
||||
password?: string;
|
||||
githubName?: string;
|
||||
wxOpenId?: string;
|
||||
}
|
||||
|
||||
export function updateUserinfo(userinfo: UserInfoPatch) {
|
||||
return request("PATCH", "/api/user/me", userinfo);
|
||||
}
|
||||
|
||||
export function getMyMemos() {
|
||||
|
|
|
@ -4,7 +4,6 @@ import { validate, ValidatorConfig } from "../helpers/validator";
|
|||
import useLoading from "../hooks/useLoading";
|
||||
import { locationService, userService } from "../services";
|
||||
import Only from "../components/common/OnlyWhen";
|
||||
import showAboutSiteDialog from "../components/AboutSiteDialog";
|
||||
import toastHelper from "../components/Toast";
|
||||
import "../less/signin.less";
|
||||
|
||||
|
@ -50,8 +49,8 @@ const Signin: React.FC<Props> = () => {
|
|||
setPassword(text);
|
||||
};
|
||||
|
||||
const handleAboutBtnClick = () => {
|
||||
showAboutSiteDialog();
|
||||
const handleSignUpBtnClick = async () => {
|
||||
toastHelper.info("注册已关闭");
|
||||
};
|
||||
|
||||
const handleSignInBtnClick = async () => {
|
||||
|
@ -186,7 +185,7 @@ const Signin: React.FC<Props> = () => {
|
|||
体验一下
|
||||
</button>
|
||||
<span className="split-text">/</span>
|
||||
<button className="btn signup-btn disabled" onClick={() => toastHelper.info("注册已关闭")}>
|
||||
<button className="btn signup-btn" onClick={handleSignUpBtnClick}>
|
||||
注册
|
||||
</button>
|
||||
<span className="split-text">/</span>
|
||||
|
|
|
@ -35,11 +35,15 @@ class UserService {
|
|||
}
|
||||
|
||||
public async updateUsername(username: string): Promise<void> {
|
||||
await api.updateUserinfo(username);
|
||||
await api.updateUserinfo({
|
||||
username,
|
||||
});
|
||||
}
|
||||
|
||||
public async removeGithubName(): Promise<void> {
|
||||
await api.updateUserinfo(undefined, undefined, "");
|
||||
await api.updateUserinfo({
|
||||
githubName: "",
|
||||
});
|
||||
}
|
||||
|
||||
public async checkPasswordValid(password: string): Promise<boolean> {
|
||||
|
@ -48,11 +52,15 @@ class UserService {
|
|||
}
|
||||
|
||||
public async updatePassword(password: string): Promise<void> {
|
||||
await api.updateUserinfo(undefined, password);
|
||||
await api.updateUserinfo({
|
||||
password,
|
||||
});
|
||||
}
|
||||
|
||||
public async updateWxOpenId(wxOpenId: string): Promise<void> {
|
||||
await api.updateUserinfo(undefined, undefined, undefined, wxOpenId);
|
||||
await api.updateUserinfo({
|
||||
wxOpenId,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue