This commit is contained in:
xmdhs 2023-10-23 21:31:28 +08:00
parent c38e5bf27f
commit 8a5ad05b14
No known key found for this signature in database
GPG Key ID: E809D6D43DEFCC95
6 changed files with 40 additions and 22 deletions

View File

@ -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) {

View File

@ -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)

View File

@ -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,
})
}
}

View File

@ -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 {

View File

@ -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) {

View File

@ -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)
}
})