@hedhog/admin 0.51.39 → 0.51.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/auth/auth.controller.d.ts +7 -0
  2. package/dist/auth/auth.controller.d.ts.map +1 -1
  3. package/dist/auth/auth.controller.js +22 -0
  4. package/dist/auth/auth.controller.js.map +1 -1
  5. package/dist/auth/auth.service.d.ts +7 -0
  6. package/dist/auth/auth.service.d.ts.map +1 -1
  7. package/dist/auth/auth.service.js +39 -0
  8. package/dist/auth/auth.service.js.map +1 -1
  9. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +11 -11
  10. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +11 -11
  11. package/dist/dashboard/dashboard-user/dashboard-user.controller.d.ts +3 -3
  12. package/dist/dashboard/dashboard-user/dashboard-user.service.d.ts +3 -3
  13. package/dist/menu/menu.controller.d.ts +3 -3
  14. package/dist/menu/menu.service.d.ts +3 -3
  15. package/dist/setting/setting.service.d.ts.map +1 -1
  16. package/dist/setting/setting.service.js +18 -1
  17. package/dist/setting/setting.service.js.map +1 -1
  18. package/frontend/dashboard/components/create-panel.tsx.ejs +63 -63
  19. package/frontend/dashboard/components/dashboard.screen.tsx.ejs +116 -116
  20. package/frontend/dashboard/components/update-panel.tsx.ejs +80 -80
  21. package/frontend/dashboard/locales/en/dashboard.dashboard.json +11 -11
  22. package/frontend/dashboard/locales/pt/dashboard.dashboard.json +11 -11
  23. package/frontend/dashboard/react-query/handlers.ts.ejs +28 -28
  24. package/frontend/dashboard/react-query/requests.ts.ejs +56 -56
  25. package/frontend/dashboard-component/components/create-panel.tsx.ejs +130 -130
  26. package/frontend/dashboard-component/components/update-panel.tsx.ejs +164 -164
  27. package/frontend/dashboard-component/locales/en/dashboard.dashboard-component.json +11 -11
  28. package/frontend/dashboard-component/locales/pt/dashboard.dashboard-component.json +11 -11
  29. package/frontend/dashboard-component/react-query/handlers.ts.ejs +28 -28
  30. package/frontend/dashboard-component/react-query/requests.ts.ejs +61 -61
  31. package/frontend/dashboard-item/components/create-panel.tsx.ejs +108 -108
  32. package/frontend/dashboard-item/components/update-panel.tsx.ejs +141 -141
  33. package/frontend/dashboard-item/locales/en/dashboard.dashboard-item.json +11 -11
  34. package/frontend/dashboard-item/locales/pt/dashboard.dashboard-item.json +11 -11
  35. package/frontend/dashboard-item/react-query/handlers.ts.ejs +28 -28
  36. package/frontend/dashboard-item/react-query/requests.ts.ejs +58 -58
  37. package/frontend/dashboard-user/components/create-panel.tsx.ejs +108 -108
  38. package/frontend/dashboard-user/components/update-panel.tsx.ejs +137 -137
  39. package/frontend/dashboard-user/locales/en/dashboard.dashboard-user.json +11 -11
  40. package/frontend/dashboard-user/locales/pt/dashboard.dashboard-user.json +11 -11
  41. package/frontend/dashboard-user/react-query/handlers.ts.ejs +28 -28
  42. package/frontend/dashboard-user/react-query/requests.ts.ejs +58 -58
  43. package/hedhog/tables/setting.yaml +1 -0
  44. package/package.json +1 -1
  45. package/src/auth/auth.controller.ts +13 -1
  46. package/src/auth/auth.service.ts +65 -1
  47. package/src/dashboard/dashboard-component/dashboard-component.controller.ts +55 -55
  48. package/src/dashboard/dashboard-component/dto/create.dto.ts +36 -36
  49. package/src/dashboard/dashboard-component/dto/update.dto.ts +4 -4
  50. package/src/dashboard/dashboard-item/dto/update.dto.ts +4 -4
  51. package/src/dashboard/dashboard-user/dto/update.dto.ts +4 -4
  52. package/src/dashboard/index.ts +1 -1
  53. package/src/setting/setting.service.ts +21 -2
@@ -1,28 +1,28 @@
1
- import { useDefaultMutation } from "@/hooks/use-default-mutation";
2
- import { useQuery } from "@tanstack/react-query";
3
- import { requests } from "./requests";
4
-
5
- const scope = "dashboard-user";
6
-
7
- export function useDashboardUserCreate() {
8
- const { dashboardUserCreate } = requests();
9
- return useDefaultMutation(scope, "create", dashboardUserCreate);
10
- }
11
-
12
- export function useDashboardUserDelete() {
13
- const { dashboardUserDelete } = requests();
14
- return useDefaultMutation(scope, "delete", dashboardUserDelete);
15
- }
16
-
17
- export function useDashboardUserUpdate() {
18
- const { dashboardUserUpdate } = requests();
19
- return useDefaultMutation(scope, "update", dashboardUserUpdate);
20
- }
21
-
22
- export function useDashboardUserGet(id: number) {
23
- const { dashboardUserGet } = requests();
24
- return useQuery({
25
- queryKey: [scope, "get"],
26
- queryFn: () => dashboardUserGet(id),
27
- });
28
- }
1
+ import { useDefaultMutation } from "@/hooks/use-default-mutation";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { requests } from "./requests";
4
+
5
+ const scope = "dashboard-user";
6
+
7
+ export function useDashboardUserCreate() {
8
+ const { dashboardUserCreate } = requests();
9
+ return useDefaultMutation(scope, "create", dashboardUserCreate);
10
+ }
11
+
12
+ export function useDashboardUserDelete() {
13
+ const { dashboardUserDelete } = requests();
14
+ return useDefaultMutation(scope, "delete", dashboardUserDelete);
15
+ }
16
+
17
+ export function useDashboardUserUpdate() {
18
+ const { dashboardUserUpdate } = requests();
19
+ return useDefaultMutation(scope, "update", dashboardUserUpdate);
20
+ }
21
+
22
+ export function useDashboardUserGet(id: number) {
23
+ const { dashboardUserGet } = requests();
24
+ return useQuery({
25
+ queryKey: [scope, "get"],
26
+ queryFn: () => dashboardUserGet(id),
27
+ });
28
+ }
@@ -1,58 +1,58 @@
1
- import { useApp } from "@/hooks/use-app";
2
- import { Delete, PaginationParams, PaginationResult } from "@/types";
3
- import { DashboardUser } from "@/types/models";
4
- import { HttpMethod } from "@/types/http-method";
5
-
6
- export function requests() {
7
- const { request } = useApp();
8
-
9
- const dashboardUserList = async (params: PaginationParams) => {
10
- return request<PaginationResult<DashboardUser>>({
11
- url: "/dashboard-user",
12
- params,
13
- }).then((res) => res.data);
14
- };
15
-
16
- const dashboardUserGet = async (id: number) => {
17
- return request<DashboardUser>({
18
- url: `/dashboard-user/${id}`,
19
- }).then((res) => res.data);
20
- };
21
-
22
- const dashboardUserCreate = async (params: { data: DashboardUser }) => {
23
- const { data } = params;
24
- return request<DashboardUser>({
25
- url: "/dashboard-user",
26
- method: HttpMethod.POST,
27
- data: data,
28
- }).then((res) => res.data);
29
- };
30
-
31
- const dashboardUserDelete = async (ids: number[]) => {
32
- return request<Delete>({
33
- url: "/dashboard-user",
34
- data: { ids },
35
- method: HttpMethod.DELETE,
36
- }).then((res) => res.data);
37
- };
38
-
39
- const dashboardUserUpdate = async (params: {
40
- id: number;
41
- data: DashboardUser;
42
- }) => {
43
- const { id, data } = params;
44
- return request<DashboardUser>({
45
- url: `/dashboard-user/${id}`,
46
- method: HttpMethod.PATCH,
47
- data: data,
48
- }).then((res) => res.data);
49
- };
50
-
51
- return {
52
- dashboardUserCreate,
53
- dashboardUserUpdate,
54
- dashboardUserDelete,
55
- dashboardUserList,
56
- dashboardUserGet,
57
- };
58
- }
1
+ import { useApp } from "@/hooks/use-app";
2
+ import { Delete, PaginationParams, PaginationResult } from "@/types";
3
+ import { DashboardUser } from "@/types/models";
4
+ import { HttpMethod } from "@/types/http-method";
5
+
6
+ export function requests() {
7
+ const { request } = useApp();
8
+
9
+ const dashboardUserList = async (params: PaginationParams) => {
10
+ return request<PaginationResult<DashboardUser>>({
11
+ url: "/dashboard-user",
12
+ params,
13
+ }).then((res) => res.data);
14
+ };
15
+
16
+ const dashboardUserGet = async (id: number) => {
17
+ return request<DashboardUser>({
18
+ url: `/dashboard-user/${id}`,
19
+ }).then((res) => res.data);
20
+ };
21
+
22
+ const dashboardUserCreate = async (params: { data: DashboardUser }) => {
23
+ const { data } = params;
24
+ return request<DashboardUser>({
25
+ url: "/dashboard-user",
26
+ method: HttpMethod.POST,
27
+ data: data,
28
+ }).then((res) => res.data);
29
+ };
30
+
31
+ const dashboardUserDelete = async (ids: number[]) => {
32
+ return request<Delete>({
33
+ url: "/dashboard-user",
34
+ data: { ids },
35
+ method: HttpMethod.DELETE,
36
+ }).then((res) => res.data);
37
+ };
38
+
39
+ const dashboardUserUpdate = async (params: {
40
+ id: number;
41
+ data: DashboardUser;
42
+ }) => {
43
+ const { id, data } = params;
44
+ return request<DashboardUser>({
45
+ url: `/dashboard-user/${id}`,
46
+ method: HttpMethod.PATCH,
47
+ data: data,
48
+ }).then((res) => res.data);
49
+ };
50
+
51
+ return {
52
+ dashboardUserCreate,
53
+ dashboardUserUpdate,
54
+ dashboardUserDelete,
55
+ dashboardUserList,
56
+ dashboardUserGet,
57
+ };
58
+ }
@@ -15,6 +15,7 @@ columns:
15
15
  - number
16
16
  - boolean
17
17
  - json
18
+ - locale
18
19
  default: string
19
20
  - name: value
20
21
  length: 1023
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hedhog/admin",
3
- "version": "0.51.39",
3
+ "version": "0.51.40",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -27,7 +27,7 @@ export class AuthController {
27
27
  constructor(
28
28
  @Inject(forwardRef(() => AuthService))
29
29
  private readonly service: AuthService,
30
- ) {}
30
+ ) { }
31
31
 
32
32
  @Public()
33
33
  @Get('create-user')
@@ -163,4 +163,16 @@ export class AuthController {
163
163
  async callbackGoogle(@Query() { code }: { code: string }) {
164
164
  return this.service.callbackGoogle(code);
165
165
  }
166
+
167
+ @Public()
168
+ @Get('facebook/login')
169
+ async loginFacebook(@Res() res) {
170
+ return this.service.loginFacebook(res);
171
+ }
172
+
173
+ @Public()
174
+ @Get('facebook/callback')
175
+ async callbackFacebook(@Query() { code }: { code: string }) {
176
+ return this.service.callbackFacebook(code);
177
+ }
166
178
  }
@@ -42,7 +42,7 @@ export class AuthService implements OnModuleInit {
42
42
  private readonly mail: MailManagerService,
43
43
  @Inject(forwardRef(() => SettingService))
44
44
  private readonly setting: SettingService,
45
- ) {}
45
+ ) { }
46
46
 
47
47
  async onModuleInit() {
48
48
  this.settings = await this.setting.getSettingValues([
@@ -865,4 +865,68 @@ export class AuthService implements OnModuleInit {
865
865
 
866
866
  return user;
867
867
  }
868
+
869
+ async loginFacebook(res: any) {
870
+ const redirectURI = new URL(
871
+ '/auth/facebook/callback',
872
+ this.settings['url'],
873
+ ).toString();
874
+
875
+ const params = new URLSearchParams({
876
+ client_id: this.settings['facebook_client_id'],
877
+ redirect_uri: redirectURI,
878
+ response_type: 'code',
879
+ scope: (this.settings['facebook_scopes'] ?? ['email']).join(','),
880
+ auth_type: 'rerequest',
881
+ });
882
+
883
+ const url = `https://www.facebook.com/v17.0/dialog/oauth?${params.toString()}`;
884
+
885
+ return res.redirect(url);
886
+ }
887
+
888
+ async callbackFacebook(code: string) {
889
+ const tokenUrl = 'https://graph.facebook.com/v17.0/oauth/access_token';
890
+ const profileUrl = 'https://graph.facebook.com/me?fields=id,name,email';
891
+
892
+ const tokenResponse = await this.fetchFacebookToken(code, tokenUrl);
893
+ const profile = await this.fetchFacebookProfile(
894
+ tokenResponse.access_token,
895
+ profileUrl,
896
+ );
897
+
898
+ let user = await this.findOrCreateUser(profile);
899
+
900
+ return this.getToken(user);
901
+ }
902
+
903
+ private async fetchFacebookToken(code: string, url: string) {
904
+ const response = await lastValueFrom(
905
+ this.httpService.post(
906
+ url,
907
+ new URLSearchParams({
908
+ client_id: this.settings['facebook_client_id'],
909
+ client_secret: this.settings['facebook_client_secret'],
910
+ redirect_uri: `${this.settings['url']}/auth/facebook/callback`,
911
+ grant_type: 'authorization_code',
912
+ code,
913
+ }).toString(),
914
+ {
915
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
916
+ },
917
+ ),
918
+ );
919
+
920
+ return response.data;
921
+ }
922
+
923
+ private async fetchFacebookProfile(accessToken: string, url: string) {
924
+ const response = await lastValueFrom(
925
+ this.httpService.get(url, {
926
+ headers: { Authorization: `Bearer ${accessToken}` },
927
+ }),
928
+ );
929
+
930
+ return response.data;
931
+ }
868
932
  }
@@ -1,55 +1,55 @@
1
- import { Pagination } from '@hedhog/pagination';
2
- import { Locale } from '@hedhog/locale';
3
- import {
4
- Body,
5
- Controller,
6
- Delete,
7
- Get,
8
- Inject,
9
- Param,
10
- ParseIntPipe,
11
- Patch,
12
- Post,
13
- forwardRef
14
- } from '@nestjs/common';
15
- import { CreateDTO } from './dto/create.dto';
16
- import { UpdateDTO } from './dto/update.dto';
17
- import { DashboardComponentService } from './dashboard-component.service';
18
- import { Role, DeleteDTO } from '@hedhog/core';
19
-
20
- @Role()
21
- @Controller('dashboard-component')
22
- export class DashboardComponentController {
23
- constructor(
24
- @Inject(forwardRef(() => DashboardComponentService))
25
- private readonly dashboardComponentService: DashboardComponentService
26
- ) {}
27
-
28
- @Get()
29
- async list(@Locale() locale, @Pagination() paginationParams) {
30
- return this.dashboardComponentService.list(locale, paginationParams);
31
- }
32
-
33
- @Get(':id')
34
- async get(@Param('id', ParseIntPipe) id: number) {
35
- return this.dashboardComponentService.get(id);
36
- }
37
-
38
- @Post()
39
- async create(@Body() data: CreateDTO) {
40
- return this.dashboardComponentService.create(data);
41
- }
42
-
43
- @Patch(':id')
44
- async update(@Param('id', ParseIntPipe) id: number, @Body() data: UpdateDTO) {
45
- return this.dashboardComponentService.update({
46
- id,
47
- data
48
- });
49
- }
50
-
51
- @Delete()
52
- async delete(@Body() data: DeleteDTO) {
53
- return this.dashboardComponentService.delete(data);
54
- }
55
- }
1
+ import { Pagination } from '@hedhog/pagination';
2
+ import { Locale } from '@hedhog/locale';
3
+ import {
4
+ Body,
5
+ Controller,
6
+ Delete,
7
+ Get,
8
+ Inject,
9
+ Param,
10
+ ParseIntPipe,
11
+ Patch,
12
+ Post,
13
+ forwardRef
14
+ } from '@nestjs/common';
15
+ import { CreateDTO } from './dto/create.dto';
16
+ import { UpdateDTO } from './dto/update.dto';
17
+ import { DashboardComponentService } from './dashboard-component.service';
18
+ import { Role, DeleteDTO } from '@hedhog/core';
19
+
20
+ @Role()
21
+ @Controller('dashboard-component')
22
+ export class DashboardComponentController {
23
+ constructor(
24
+ @Inject(forwardRef(() => DashboardComponentService))
25
+ private readonly dashboardComponentService: DashboardComponentService
26
+ ) {}
27
+
28
+ @Get()
29
+ async list(@Locale() locale, @Pagination() paginationParams) {
30
+ return this.dashboardComponentService.list(locale, paginationParams);
31
+ }
32
+
33
+ @Get(':id')
34
+ async get(@Param('id', ParseIntPipe) id: number) {
35
+ return this.dashboardComponentService.get(id);
36
+ }
37
+
38
+ @Post()
39
+ async create(@Body() data: CreateDTO) {
40
+ return this.dashboardComponentService.create(data);
41
+ }
42
+
43
+ @Patch(':id')
44
+ async update(@Param('id', ParseIntPipe) id: number, @Body() data: UpdateDTO) {
45
+ return this.dashboardComponentService.update({
46
+ id,
47
+ data
48
+ });
49
+ }
50
+
51
+ @Delete()
52
+ async delete(@Body() data: DeleteDTO) {
53
+ return this.dashboardComponentService.delete(data);
54
+ }
55
+ }
@@ -1,36 +1,36 @@
1
- import { IsString, IsNumber, IsBoolean, IsOptional } from 'class-validator';
2
- import { WithLocaleDTO } from '@hedhog/locale';
3
-
4
- export class CreateDTO extends WithLocaleDTO {
5
- @IsString()
6
- slug: string;
7
-
8
- @IsString()
9
- path: string;
10
-
11
- @IsOptional()
12
- @IsNumber()
13
- min_width?: number;
14
-
15
- @IsOptional()
16
- @IsNumber()
17
- max_width?: number;
18
-
19
- @IsOptional()
20
- @IsNumber()
21
- min_height?: number;
22
-
23
- @IsOptional()
24
- @IsNumber()
25
- max_height?: number;
26
-
27
- @IsNumber()
28
- width: number;
29
-
30
- @IsNumber()
31
- height: number;
32
-
33
- @IsOptional()
34
- @IsBoolean()
35
- is_resizable?: boolean;
36
- }
1
+ import { IsString, IsNumber, IsBoolean, IsOptional } from 'class-validator';
2
+ import { WithLocaleDTO } from '@hedhog/locale';
3
+
4
+ export class CreateDTO extends WithLocaleDTO {
5
+ @IsString()
6
+ slug: string;
7
+
8
+ @IsString()
9
+ path: string;
10
+
11
+ @IsOptional()
12
+ @IsNumber()
13
+ min_width?: number;
14
+
15
+ @IsOptional()
16
+ @IsNumber()
17
+ max_width?: number;
18
+
19
+ @IsOptional()
20
+ @IsNumber()
21
+ min_height?: number;
22
+
23
+ @IsOptional()
24
+ @IsNumber()
25
+ max_height?: number;
26
+
27
+ @IsNumber()
28
+ width: number;
29
+
30
+ @IsNumber()
31
+ height: number;
32
+
33
+ @IsOptional()
34
+ @IsBoolean()
35
+ is_resizable?: boolean;
36
+ }
@@ -1,4 +1,4 @@
1
- import { PartialType } from '@nestjs/mapped-types';
2
- import { CreateDTO } from './create.dto';
3
-
4
- export class UpdateDTO extends PartialType(CreateDTO) {}
1
+ import { PartialType } from '@nestjs/mapped-types';
2
+ import { CreateDTO } from './create.dto';
3
+
4
+ export class UpdateDTO extends PartialType(CreateDTO) {}
@@ -1,4 +1,4 @@
1
- import { PartialType } from '@nestjs/mapped-types';
2
- import { CreateDTO } from './create.dto';
3
-
4
- export class UpdateDTO extends PartialType(CreateDTO) {}
1
+ import { PartialType } from '@nestjs/mapped-types';
2
+ import { CreateDTO } from './create.dto';
3
+
4
+ export class UpdateDTO extends PartialType(CreateDTO) {}
@@ -1,4 +1,4 @@
1
- import { PartialType } from '@nestjs/mapped-types';
2
- import { CreateDTO } from './create.dto';
3
-
4
- export class UpdateDTO extends PartialType(CreateDTO) {}
1
+ import { PartialType } from '@nestjs/mapped-types';
2
+ import { CreateDTO } from './create.dto';
3
+
4
+ export class UpdateDTO extends PartialType(CreateDTO) {}
@@ -1 +1 @@
1
- export * from './dashboard.module';
1
+ export * from './dashboard.module';
@@ -361,7 +361,7 @@ export class SettingService {
361
361
  const data: Record<string, any> = {};
362
362
 
363
363
  for (const s of setting) {
364
- switch (s.type) {
364
+ switch (s.type as any) {
365
365
  case 'boolean':
366
366
  data[s.slug] = s.value === 'true';
367
367
  break;
@@ -373,10 +373,17 @@ export class SettingService {
373
373
  try {
374
374
  data[s.slug] = JSON.parse(s.value);
375
375
  } catch (err) {
376
- console.error('Error parsing JSON', s.value, err);
376
+ console.warn('Error parsing JSON', s.value, err);
377
377
  data[s.slug] = s.value;
378
378
  }
379
379
  break;
380
+ case 'locale':
381
+ try {
382
+ data[s.slug] = JSON.parse(s.value);
383
+ } catch (err) {
384
+ console.warn('Error parsing locale JSON', s.value, err);
385
+ data[s.slug] = s.value;
386
+ }
380
387
  default:
381
388
  data[s.slug] = s.value;
382
389
  }
@@ -387,6 +394,18 @@ export class SettingService {
387
394
  ss.value;
388
395
  });
389
396
 
397
+ for (const s of slug) {
398
+ const notFoundSlugs: string[] = [];
399
+ if (data[s] === undefined) {
400
+ notFoundSlugs.push(s);
401
+ }
402
+ if (notFoundSlugs.length > 0) {
403
+ throw new BadRequestException(
404
+ `Settings with slugs ${notFoundSlugs.join(', ')} not found.`,
405
+ );
406
+ }
407
+ }
408
+
390
409
  return data;
391
410
  }
392
411