This commit is contained in:
parent
c38e5bf27f
commit
8a5ad05b14
@ -24,7 +24,7 @@ export async function register(email: string, username: string, password: string
|
||||
"CaptchaToken": captchaToken
|
||||
})
|
||||
})
|
||||
return await apiGet(v)
|
||||
return await apiGet<tokenData>(v)
|
||||
}
|
||||
|
||||
export async function userInfo(token: string) {
|
||||
|
@ -20,6 +20,8 @@ import CaptchaWidget from '@/components/CaptchaWidget';
|
||||
import type { refType as CaptchaWidgetRef } from '@/components/CaptchaWidget'
|
||||
import useTitle from '@/hooks/useTitle';
|
||||
import { ApiErr } from '@/apis/error';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { token, user } from '@/store/store';
|
||||
|
||||
export default function SignUp() {
|
||||
const [regErr, setRegErr] = useState("");
|
||||
@ -28,6 +30,8 @@ export default function SignUp() {
|
||||
const captchaRef = useRef<CaptchaWidgetRef>(null)
|
||||
const [loading, setLoading] = useState(false);
|
||||
useTitle("注册")
|
||||
const setToken = useSetAtom(token)
|
||||
const setUserInfo = useSetAtom(user)
|
||||
|
||||
|
||||
const checkList = React.useRef<Map<string, refType>>(new Map<string, refType>())
|
||||
@ -51,7 +55,15 @@ export default function SignUp() {
|
||||
}
|
||||
setLoading(true)
|
||||
register(d.email ?? "", d.username ?? "", d.password ?? "", captchaToken).
|
||||
then(() => navigate("/login")).
|
||||
then(v => {
|
||||
if (!v) return
|
||||
setToken(v.token)
|
||||
setUserInfo({
|
||||
uuid: v.uuid,
|
||||
name: v.name,
|
||||
})
|
||||
navigate("/profile")
|
||||
}).
|
||||
catch(v => {
|
||||
captchaRef.current?.reload()
|
||||
console.warn(v)
|
||||
|
@ -33,13 +33,14 @@ func (h *Handel) Reg() http.HandlerFunc {
|
||||
h.handleError(ctx, w, err.Error(), model.ErrUnknown, 500, slog.LevelWarn)
|
||||
return
|
||||
}
|
||||
err = h.webService.Reg(ctx, u, rip, ip)
|
||||
lr, err := h.webService.Reg(ctx, u, rip, ip)
|
||||
if err != nil {
|
||||
h.handleErrorService(ctx, w, err)
|
||||
return
|
||||
}
|
||||
encodeJson(w, model.API[any]{
|
||||
encodeJson(w, model.API[model.LoginRep]{
|
||||
Code: 0,
|
||||
Data: lr,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -11,25 +11,19 @@ import (
|
||||
|
||||
func TestWebService_Auth(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
err := webService.Reg(ctx, model.UserReg{
|
||||
lr, err := webService.Reg(ctx, model.UserReg{
|
||||
Email: "TestWebService_Auth@xmdhs.com",
|
||||
Password: "TestWebService_Auth",
|
||||
Name: "TestWebService_Auth",
|
||||
CaptchaToken: "",
|
||||
}, "127.0.1.0/24", "127.0.1.0")
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, lr.Name, "TestWebService_Auth")
|
||||
|
||||
l, err := webService.Login(ctx, model.Login{
|
||||
Email: "TestWebService_Auth@xmdhs.com",
|
||||
Password: "TestWebService_Auth",
|
||||
CaptchaToken: "",
|
||||
}, "0.0.0.0")
|
||||
token, err := webService.Auth(ctx, lr.Token)
|
||||
require.Nil(t, err)
|
||||
|
||||
token, err := webService.Auth(ctx, l.Token)
|
||||
require.Nil(t, err)
|
||||
|
||||
assert.Equal(t, token.Subject, l.UUID)
|
||||
assert.Equal(t, token.Subject, lr.UUID)
|
||||
assert.Equal(t, token.Tid, "1")
|
||||
|
||||
type args struct {
|
||||
|
@ -25,7 +25,7 @@ var (
|
||||
ErrChangeName = errors.New("离线模式 uuid 不允许修改用户名")
|
||||
)
|
||||
|
||||
func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip string) error {
|
||||
func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip string) (model.LoginRep, error) {
|
||||
var userUuid string
|
||||
if w.config.OfflineUUID {
|
||||
userUuid = utils.UUIDGen(u.Name)
|
||||
@ -35,21 +35,23 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
||||
|
||||
err := w.verifyCaptcha(ctx, u.CaptchaToken, ip)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Reg: %w", err)
|
||||
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||
}
|
||||
|
||||
if w.config.MaxIpUser != 0 {
|
||||
c, err := w.client.User.Query().Where(user.RegIPEQ(ipPrefix)).Count(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Reg: %w", err)
|
||||
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||
}
|
||||
if c >= w.config.MaxIpUser {
|
||||
return fmt.Errorf("Reg: %w", ErrRegLimit)
|
||||
return model.LoginRep{}, fmt.Errorf("Reg: %w", ErrRegLimit)
|
||||
}
|
||||
}
|
||||
|
||||
p, s := utils.Argon2ID(u.Password)
|
||||
|
||||
var du *ent.User
|
||||
|
||||
err = utils.WithTx(ctx, w.client, func(tx *ent.Tx) error {
|
||||
count, err := tx.User.Query().Where(user.EmailEQ(u.Email)).ForUpdateA().Count(ctx)
|
||||
if err != nil {
|
||||
@ -65,7 +67,7 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
||||
if nameCount != 0 {
|
||||
return ErrExitsName
|
||||
}
|
||||
du, err := tx.User.Create().
|
||||
du, err = tx.User.Create().
|
||||
SetEmail(u.Email).
|
||||
SetPassword(p).
|
||||
SetSalt(s).
|
||||
@ -92,9 +94,18 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("Reg: %w", err)
|
||||
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||
}
|
||||
return nil
|
||||
jwt, err := utilsService.CreateToken(ctx, du, w.client, w.cache, w.prikey, "web")
|
||||
if err != nil {
|
||||
return model.LoginRep{}, fmt.Errorf("Login: %w", err)
|
||||
}
|
||||
|
||||
return model.LoginRep{
|
||||
Token: jwt,
|
||||
Name: u.Name,
|
||||
UUID: userUuid,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (w *WebService) Login(ctx context.Context, l model.Login, ip string) (model.LoginRep, error) {
|
||||
|
@ -143,7 +143,7 @@ func TestWebService_Reg(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if err := tt.w.Reg(tt.args.ctx, tt.args.u, tt.args.ipPrefix, tt.args.ip); (err != nil) != tt.wantErr {
|
||||
if _, err := tt.w.Reg(tt.args.ctx, tt.args.u, tt.args.ipPrefix, tt.args.ip); (err != nil) != tt.wantErr {
|
||||
t.Errorf("WebService.Reg() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user