diff --git a/src/client/users.go b/src/client/users.go index eb5de39..ac978b2 100644 --- a/src/client/users.go +++ b/src/client/users.go @@ -11,24 +11,24 @@ import ( "github.com/parnurzeal/gorequest" ) -type SingleUserClient struct { +type UsersClient struct { addr string r *gorequest.SuperAgent } -func NewSingleUserClient(addr string) *SingleUserClient { +func NewUsersClient(addr string) *UsersClient { gr := gorequest.New() - return &SingleUserClient{ + return &UsersClient{ addr: addr, r: gr, } } -func (cl *SingleUserClient) url(urlpath string) string { +func (cl *UsersClient) url(urlpath string) string { return fmt.Sprintf("%s%s", cl.addr, urlpath) } -func (cl *SingleUserClient) Login(user, pwd string) (*http.Response, string, []error) { +func (cl *UsersClient) Login(user, pwd string) (*http.Response, string, []error) { return cl.r.Post(cl.url("/v1/users/login")). Send(multiusers.LoginReq{ User: user, @@ -37,13 +37,13 @@ func (cl *SingleUserClient) Login(user, pwd string) (*http.Response, string, []e End() } -func (cl *SingleUserClient) Logout(token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) Logout(token *http.Cookie) (*http.Response, string, []error) { return cl.r.Post(cl.url("/v1/users/logout")). AddCookie(token). End() } -func (cl *SingleUserClient) SetPwd(oldPwd, newPwd string, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) SetPwd(oldPwd, newPwd string, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Patch(cl.url("/v1/users/pwd")). Send(multiusers.SetPwdReq{ OldPwd: oldPwd, @@ -53,7 +53,7 @@ func (cl *SingleUserClient) SetPwd(oldPwd, newPwd string, token *http.Cookie) (* End() } -func (cl *SingleUserClient) ForceSetPwd(userID, newPwd string, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) ForceSetPwd(userID, newPwd string, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Patch(cl.url("/v1/users/pwd/force-set")). Send(multiusers.ForceSetPwdReq{ ID: userID, @@ -63,7 +63,7 @@ func (cl *SingleUserClient) ForceSetPwd(userID, newPwd string, token *http.Cooki End() } -func (cl *SingleUserClient) SetUser(ID uint64, role string, quota *db.Quota, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) SetUser(ID uint64, role string, quota *db.Quota, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Patch(cl.url("/v1/users/")). Send(multiusers.SetUserReq{ ID: ID, @@ -74,7 +74,7 @@ func (cl *SingleUserClient) SetUser(ID uint64, role string, quota *db.Quota, tok End() } -func (cl *SingleUserClient) AddUser(name, pwd, role string, token *http.Cookie) (*http.Response, *multiusers.AddUserResp, []error) { +func (cl *UsersClient) AddUser(name, pwd, role string, token *http.Cookie) (*http.Response, *multiusers.AddUserResp, []error) { resp, body, errs := cl.r.Post(cl.url("/v1/users/")). AddCookie(token). Send(multiusers.AddUserReq{ @@ -97,14 +97,14 @@ func (cl *SingleUserClient) AddUser(name, pwd, role string, token *http.Cookie) return resp, auResp, errs } -func (cl *SingleUserClient) DelUser(id string, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) DelUser(id string, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Delete(cl.url("/v1/users/")). AddCookie(token). Param(handlers.UserIDParam, id). End() } -func (cl *SingleUserClient) ListUsers(token *http.Cookie) (*http.Response, *multiusers.ListUsersResp, []error) { +func (cl *UsersClient) ListUsers(token *http.Cookie) (*http.Response, *multiusers.ListUsersResp, []error) { resp, body, errs := cl.r.Get(cl.url("/v1/users/list")). AddCookie(token). End() @@ -121,7 +121,7 @@ func (cl *SingleUserClient) ListUsers(token *http.Cookie) (*http.Response, *mult return resp, lsResp, errs } -func (cl *SingleUserClient) AddRole(role string, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) AddRole(role string, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Post(cl.url("/v1/roles/")). AddCookie(token). Send(multiusers.AddRoleReq{ @@ -130,7 +130,7 @@ func (cl *SingleUserClient) AddRole(role string, token *http.Cookie) (*http.Resp End() } -func (cl *SingleUserClient) DelRole(role string, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) DelRole(role string, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Delete(cl.url("/v1/roles/")). AddCookie(token). Send(multiusers.DelRoleReq{ @@ -139,7 +139,7 @@ func (cl *SingleUserClient) DelRole(role string, token *http.Cookie) (*http.Resp End() } -func (cl *SingleUserClient) ListRoles(token *http.Cookie) (*http.Response, *multiusers.ListRolesResp, []error) { +func (cl *UsersClient) ListRoles(token *http.Cookie) (*http.Response, *multiusers.ListRolesResp, []error) { resp, body, errs := cl.r.Get(cl.url("/v1/roles/list")). AddCookie(token). End() @@ -156,7 +156,7 @@ func (cl *SingleUserClient) ListRoles(token *http.Cookie) (*http.Response, *mult return resp, lsResp, errs } -func (cl *SingleUserClient) Self(token *http.Cookie) (*http.Response, *multiusers.SelfResp, []error) { +func (cl *UsersClient) Self(token *http.Cookie) (*http.Response, *multiusers.SelfResp, []error) { resp, body, errs := cl.r.Get(cl.url("/v1/users/self")). AddCookie(token). End() @@ -173,7 +173,7 @@ func (cl *SingleUserClient) Self(token *http.Cookie) (*http.Response, *multiuser return resp, selfResp, errs } -func (cl *SingleUserClient) SetPreferences(prefers *db.Preferences, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) SetPreferences(prefers *db.Preferences, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Patch(cl.url("/v1/users/preferences")). Send(multiusers.SetPreferencesReq{ Preferences: prefers, @@ -182,13 +182,13 @@ func (cl *SingleUserClient) SetPreferences(prefers *db.Preferences, token *http. End() } -func (cl *SingleUserClient) IsAuthed(token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) IsAuthed(token *http.Cookie) (*http.Response, string, []error) { return cl.r.Get(cl.url("/v1/users/isauthed")). AddCookie(token). End() } -func (cl *SingleUserClient) ResetUsedSpace(userID uint64, token *http.Cookie) (*http.Response, string, []error) { +func (cl *UsersClient) ResetUsedSpace(userID uint64, token *http.Cookie) (*http.Response, string, []error) { return cl.r.Put(cl.url("/v1/users/used-space")). Send(multiusers.ResetUsedSpaceReq{ UserID: userID, diff --git a/src/client/web/src/client/index.ts b/src/client/web/src/client/index.ts index f387b21..0ad07fd 100644 --- a/src/client/web/src/client/index.ts +++ b/src/client/web/src/client/index.ts @@ -164,6 +164,7 @@ export interface IFilesClient { generateHash: (filePath: string) => Promise; download: (url: string) => Promise; search: (keywords: string[]) => Promise>; + reindex: () => Promise; } export interface ISettingsClient { diff --git a/src/client/web/src/components/pane_admin.tsx b/src/client/web/src/components/pane_admin.tsx index f6498a2..eb1b775 100644 --- a/src/client/web/src/components/pane_admin.tsx +++ b/src/client/web/src/components/pane_admin.tsx @@ -268,6 +268,20 @@ export class UserForm extends React.Component<
+
+ {this.props.msg.pkg.get("action.reindex.desc")}, + , + ])} + childrenStyles={List([{}, { justifyContent: "flex-end" }])} + /> +
+ +
+ { } }; + reindex = async () => { + return updater().reindex(); + } + addUser = async () => { if (this.state.newUserPwd1 !== this.state.newUserPwd2) { Env().alertMsg(this.props.msg.pkg.get("settings.pwd.notSame")); diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 1554e7d..4f348de 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -1034,6 +1034,11 @@ export class Updater { return ""; }; + reindex = async (): Promise => { + const resp = await this.filesClient.reindex(); + return resp.status === 200 ? "" : errServer; + } + hasResult = (): boolean => { return this.props.filesInfo.searchResults.size > 0; }; diff --git a/src/client/web/src/i18n/en_US.ts b/src/client/web/src/i18n/en_US.ts index 65e328a..a5ef387 100644 --- a/src/client/web/src/i18n/en_US.ts +++ b/src/client/web/src/i18n/en_US.ts @@ -158,5 +158,7 @@ export const msgs: Map = Map({ "term.results": "Results", "term.noResult": "No result found", "action.go": "Go", - "hint.keywords": "Please input keyword(s), separated by spaces" + "hint.keywords": "Please input keyword(s), separated by spaces", + "action.reindex": "Reindex", + "action.reindex.desc": "Reconstruct the searching index", }); diff --git a/src/client/web/src/i18n/zh_CN.ts b/src/client/web/src/i18n/zh_CN.ts index 0f5c8ef..f06976e 100644 --- a/src/client/web/src/i18n/zh_CN.ts +++ b/src/client/web/src/i18n/zh_CN.ts @@ -155,5 +155,7 @@ export const msgs: Map = Map({ "term.results": "结果", "term.noResult": "未找到结果", "action.go": "前往", - "hint.keywords": "请输入关键字,以空格分隔" + "hint.keywords": "请输入关键字,以空格分隔", + "action.reindex": "重新索引", + "action.reindex.desc": "重新建立搜索索引", }); diff --git a/src/server/server_concurrency_test.go b/src/server/server_concurrency_test.go index cf99f9b..fa3b984 100644 --- a/src/server/server_concurrency_test.go +++ b/src/server/server_concurrency_test.go @@ -48,7 +48,7 @@ func TestConcurrency(t *testing.T) { t.Fatal("fail to start server") } - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminPwd) if len(errs) > 0 { t.Fatal(errs) @@ -67,7 +67,7 @@ func TestConcurrency(t *testing.T) { filesCount := 10 mockClient := func(name, pwd string, wg *sync.WaitGroup) { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(name, pwd) if len(errs) > 0 { t.Fatal(errs) diff --git a/src/server/server_files_test.go b/src/server/server_files_test.go index b5a5f3e..eddab5a 100644 --- a/src/server/server_files_test.go +++ b/src/server/server_files_test.go @@ -62,7 +62,7 @@ func TestFileHandlers(t *testing.T) { t.Fatal("fail to start server") } - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminPwd) if len(errs) > 0 { t.Fatal(errs) @@ -405,7 +405,7 @@ func TestFileHandlers(t *testing.T) { } } - userUsersCl := client.NewSingleUserClient(addr) + userUsersCl := client.NewUsersClient(addr) resp, _, errs := userUsersCl.Login("demo", "Quicksh@re") if len(errs) > 0 { t.Fatal(errs) @@ -918,6 +918,19 @@ func TestFileHandlers(t *testing.T) { t.Fatal("search result not match") } + userFilesClient, err := loginFilesClient(addr, "demo", "Quicksh@re") + if err != nil { + t.Fatal(err) + } + resp, searchItemsResp, errs = userFilesClient.SearchItems(keywords) + if len(errs) > 0 { + t.Fatal(errs) + } else if resp.StatusCode != 200 { + t.Fatal(resp.StatusCode) + } else if len(searchItemsResp.Results) > 0 { + t.Fatal("shoud return empty results") + } + // delete paths for pathname := range toDelete { resp, _, errs := cl.Delete(pathname) diff --git a/src/server/server_permission_test.go b/src/server/server_permission_test.go index e89cf93..f4b5956 100644 --- a/src/server/server_permission_test.go +++ b/src/server/server_permission_test.go @@ -114,7 +114,7 @@ func TestPermissions(t *testing.T) { tmpAdmin, tmpAdminPwd := "tmpAdmin", "1234" tmpNewRole := "tmpNewRole" - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} if requireAuth { resp, _, errs := cl.Login(user, pwd) @@ -290,7 +290,7 @@ func TestPermissions(t *testing.T) { // Mkdir // Move - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} if requireAuth { @@ -381,7 +381,7 @@ func TestPermissions(t *testing.T) { }) uploadSample := func() { - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} resp, _, errs := cl.Login("user2", "1234") @@ -411,7 +411,7 @@ func TestPermissions(t *testing.T) { // GenerateHash // Search - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} if requireAuth { resp, _, errs := cl.Login(user, pwd) @@ -575,7 +575,7 @@ func TestPermissions(t *testing.T) { // sharing permission tests enableSharing := func() { - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} resp, _, errs := cl.Login("share", "1234") @@ -631,7 +631,7 @@ func TestPermissions(t *testing.T) { // ListSharingIDs // GetSharingDir - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} homePath := "/" desc := user @@ -727,7 +727,7 @@ func TestPermissions(t *testing.T) { // SetClientCfg // ReportErrors - cl := client.NewSingleUserClient(addr) + cl := client.NewUsersClient(addr) token := &http.Cookie{} desc := user errReports := &settings.ClientErrorReports{ diff --git a/src/server/server_settings_test.go b/src/server/server_settings_test.go index 590b84a..086b27f 100644 --- a/src/server/server_settings_test.go +++ b/src/server/server_settings_test.go @@ -62,7 +62,7 @@ func TestSettingsHandlers(t *testing.T) { t.Fatal("fail to start server") } - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminPwd) if len(errs) > 0 { t.Fatal(errs) diff --git a/src/server/server_space_limit_test.go b/src/server/server_space_limit_test.go index 85f9b68..11d24a1 100644 --- a/src/server/server_space_limit_test.go +++ b/src/server/server_space_limit_test.go @@ -63,7 +63,7 @@ func TestSpaceLimit(t *testing.T) { t.Fatal("fail to start server") } - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminPwd) if len(errs) > 0 { t.Fatal(errs) @@ -100,7 +100,7 @@ func TestSpaceLimit(t *testing.T) { } t.Run("test space limiting: Upload", func(t *testing.T) { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(getUserName(0), userPwd) if len(errs) > 0 { t.Fatal(errs) @@ -230,7 +230,7 @@ func TestSpaceLimit(t *testing.T) { }) t.Run("ResetUsedSpace", func(t *testing.T) { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login("test", "test") if len(errs) > 0 { t.Fatal(errs) diff --git a/src/server/server_users_test.go b/src/server/server_users_test.go index ab9ae1a..0c22a32 100644 --- a/src/server/server_users_test.go +++ b/src/server/server_users_test.go @@ -72,7 +72,7 @@ func TestUsersHandlers(t *testing.T) { defer srv.Shutdown() fs := srv.depsFS() - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) settingsCl := client.NewSettingsClient(addr) if !isServerReady(addr) { @@ -82,7 +82,7 @@ func TestUsersHandlers(t *testing.T) { var err error t.Run("test inited users", func(t *testing.T) { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminPwd) if len(errs) > 0 { t.Fatal(errs) @@ -164,7 +164,7 @@ func TestUsersHandlers(t *testing.T) { } for _, user := range users { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(user.Name, user.Pwd) if len(errs) > 0 { t.Fatal(errs) @@ -451,7 +451,7 @@ func TestUsersHandlers(t *testing.T) { }) t.Run("Login, SetPreferences, Self, Logout", func(t *testing.T) { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) resp, _, errs := usersCl.Login(adminName, adminNewPwd) if len(errs) > 0 { t.Fatal(errs) diff --git a/src/server/test_helpers.go b/src/server/test_helpers.go index f0c788a..e0d5e2e 100644 --- a/src/server/test_helpers.go +++ b/src/server/test_helpers.go @@ -2,6 +2,7 @@ package server import ( "encoding/base64" + "errors" "fmt" "io/ioutil" "math/rand" @@ -16,6 +17,7 @@ import ( "github.com/ihexxa/quickshare/src/client" "github.com/ihexxa/quickshare/src/db" fspkg "github.com/ihexxa/quickshare/src/fs" + q "github.com/ihexxa/quickshare/src/handlers" ) func startTestServer(config string) *Server { @@ -57,7 +59,7 @@ func getUserName(id int) string { } func addUsers(t *testing.T, addr, userPwd string, userCount int, adminToken *http.Cookie) map[string]string { - usersCl := client.NewSingleUserClient(addr) + usersCl := client.NewUsersClient(addr) users := map[string]string{} for i := range make([]int, userCount) { userName := getUserName(i) @@ -220,3 +222,25 @@ func assertResp(t *testing.T, resp *http.Response, errs []error, expectedCode in t.Fatal(desc, resp.StatusCode, expectedCode) } } + +func joinErrs(errs []error) error { + msgs := []string{} + for _, err := range errs { + msgs = append(msgs, err.Error()) + } + + return errors.New(strings.Join(msgs, ",")) +} + +func loginFilesClient(addr, user, pwd string) (*client.FilesClient, error) { + usersCl := client.NewUsersClient(addr) + resp, _, errs := usersCl.Login(user, pwd) + if len(errs) > 0 { + return nil, joinErrs(errs) + } else if resp.StatusCode != 200 { + return nil, fmt.Errorf("unexpected code(%d)", resp.StatusCode) + } + + token := client.GetCookie(resp.Cookies(), q.TokenCookie) + return client.NewFilesClient(addr, token), nil +} diff --git a/src/server/testdata/test_quickshare.db b/src/server/testdata/test_quickshare.db index 7a66137..9a9bcd3 100644 Binary files a/src/server/testdata/test_quickshare.db and b/src/server/testdata/test_quickshare.db differ