mirror of
https://github.com/usememos/memos.git
synced 2024-09-20 14:35:54 +08:00
update users table with unique tag
This commit is contained in:
parent
9db1f57307
commit
b20741cca8
24
api/auth.go
24
api/auth.go
|
@ -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, "")
|
||||||
}
|
}
|
||||||
|
|
36
api/user.go
36
api/user.go
|
@ -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 {
|
||||||
|
|
|
@ -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.
|
@ -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)
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue