diff --git a/src/controllers/Routes.ts b/src/controllers/Routes.ts index 8449ac6..df5d480 100644 --- a/src/controllers/Routes.ts +++ b/src/controllers/Routes.ts @@ -135,6 +135,8 @@ export const Routes : Route[] = [ {path: "/search/user", cb: (h) => SearchController.SearchUser(h)}, {path: "/user/search", cb: (h) => SearchController.SearchUser(h)}, // Legacy + {path: "/search/global", cb: (h) => SearchController.SearchGlobal(h)}, + // Groups controller {path: "/groups/create", cb: (h) => GroupsController.Create(h)}, diff --git a/src/controllers/SearchController.ts b/src/controllers/SearchController.ts index 389f71d..18c8c41 100644 --- a/src/controllers/SearchController.ts +++ b/src/controllers/SearchController.ts @@ -1,5 +1,6 @@ import { RequestHandler } from "../entities/RequestHandler"; import { UserHelper } from "../helpers/UserHelper"; +import { GroupsHelper } from "../helpers/GroupsHelper"; /** * Search controller @@ -25,4 +26,31 @@ export class SearchController { h.send(list); } + /** + * Perform a global search (search both groups & users) + * + * @param h Request handler + */ + public static async SearchGlobal(h: RequestHandler) { + const query = h.postString("query", 1); + const limit = 10; + + const results = []; + + // First, search for groups + const groups = await GroupsHelper.SearchGroup(query, limit); + groups.map((e) => ({ + kind: "group", + id: e + })).forEach((el) => results.push(el)); + + // Then search for users + const users = await UserHelper.SearchUser(query, limit); + users.map((e) => ({ + kind: "user", + id: e + })).forEach((el) => results.push(el)); + + h.send(results); + } } \ No newline at end of file diff --git a/src/helpers/GroupsHelper.ts b/src/helpers/GroupsHelper.ts index 849e222..be22c09 100644 --- a/src/helpers/GroupsHelper.ts +++ b/src/helpers/GroupsHelper.ts @@ -144,6 +144,27 @@ export class GroupsHelper { return this.DbToGroupInfo(row); } + /** + * Search for groups + * + * @param query The query + * @param limit LImit for the search + */ + public static async SearchGroup(query: string, limit: number = 10) : Promise> { + + const results = await DatabaseHelper.Query({ + table: GROUPS_LIST_TABLE, + + customWhere: "name LIKE ? AND visibility != ?", + customWhereArgs: ["%"+query+"%", GroupVisibilityLevel.SECRETE_GROUP.toString()], + + limit: limit, + fields: ["id"] + }); + + return results.map((e) => e.id); + } + /** * Update (set) group settings *