• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

useFactory 사용시 resource 파일 분리 후 di 방법

21.11.19 19:23 작성 조회수 252

1

먼저 너무 좋은 ADMIN 대시보드 라이브러리를 알려주셔서 감사합니다.

해당 라이브러리로 몇가지 테스트해보는 중인데 adminJsOptions가 너무 길어져 resources를 별도의 파일로 분리하려 하고 있습니다.

하다보니 이미 factory로 blogModel을 inject하고 있는데 resources를 별도의 파일로 분리하려고 보니 blogModel을 분리한 파일에서 어떻게 가져와야할지 막막하더라구요.

adminjs뿐아니라 다른 모듈을 사용할때도 useFactory를 통해 di를 해주는경우가 많은데 이럴때는 분리된 파일에는 어떻게 의존성을 주입해줘야 할까요???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import * as AdminJSMongoose from '@adminjs/mongoose';
import { AdminModule as AdminBroModule } from '@adminjs/nestjs';
import { Module } from '@nestjs/common';
import { getModelToken } from '@nestjs/mongoose';
import AdminJS from 'adminjs';
import { Model } from 'mongoose';
import { UsersModule } from 'src/users/users.module';
import { User } from 'src/users/users.schema';
import { after, before } from './hooks/users.hooks';
 
AdminJS.registerAdapter(AdminJSMongoose);
 
@Module({
    imports: [
        AdminBroModule.createAdminAsync({
            imports: [UsersModule],
            inject: [getModelToken(User.name)],
            useFactory: (usersModel: Model<User>=> ({
                adminJsOptions: {
                    rootPath: '/admin',
                    resources: [
                        {
                            resource: usersModel,
                            options: {
                                navigation: {
                                    namenull,
                                    icon: '',
                                },
                                properties: {
                                    email: {
                                        isTitle: false,
                                        position: 1,
                                    },
                                    name: {
                                        isTitle: true,
                                    },
                                    _id: {
                                        isVisible: { list: false },
                                    },
                                    password: {
                                        isVisible: false,
                                    },
                                },
                                actions: {
                                    edit: { isAccessible: isAdmin },
                                    delete: { isAccessible: isAdmin },
                                    new: { isAccessible: isAdmin },
                                    show: {
                                        isAccessible: isAdmin,
                                    },
                                    list: { isAccessible: isAdmin },
                                    custom_delete: {
                                        actionType: 'record',
                                        icon: 'TrashCan',
                                        guard: 'doYouReallyWantToDoThis',
                                        variant: 'danger',
                                        before: before,
                                        after: after,
                                        handler: async (request, response, context) => {
                                            const user = context.record;
                                            await usersModel.findOne({_id: request.params.id});
                                            console.log('custom handler!!!');
                                            return {
                                                record: user.toJSON(context.currentAdmin),
                                            };
                                        }
                                    },
                                },
                            },
                        },
                    ],
                },
                auth: {
                    authenticate: async (email, password) => {
                        const user = await usersModel.findOne({ email: email });
                        if (user) {
                            const matched = user.password === password;
                            if (matched && user.role === 'ADMIN') {
                                return user.readOnlyData;
                            }
                        }
                        return null;
                    },
                    cookieName: 'cookie-test',
                    cookiePassword: 'test',
                },
            }),
        }),
    ],
})
export class AdminModule {}
 
const isAdmin = ({ currentAdmin }) => currentAdmin && currentAdmin.role === 'ADMIN';
 

resource 코드 분리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import * as AdminJSMongoose from '@adminjs/mongoose';
import { AdminModule as AdminBroModule } from '@adminjs/nestjs';
import { Module } from '@nestjs/common';
import { getModelToken } from '@nestjs/mongoose';
import AdminJS from 'adminjs';
import { Model } from 'mongoose';
import { UsersModule } from 'src/users/users.module';
import { User } from 'src/users/users.schema';
import { after, before } from './hooks/users.hooks';
import { userResource } from './resources/users.resource';
 
AdminJS.registerAdapter(AdminJSMongoose);
 
@Module({
    imports: [
        AdminBroModule.createAdminAsync({
            imports: [UsersModule],
            inject: [getModelToken(User.name)],
            useFactory: (usersModel: Model<User>=> ({
                adminJsOptions: {
                    rootPath: '/admin',
                    resources: [
                        userResource
                    ],
                },
                auth: {
                    authenticate: async (email, password) => {
                        const user = await usersModel.findOne({ email: email });
                        if (user) {
                            const matched = user.password === password;
                            if (matched && user.role === 'ADMIN') {
                                return user.readOnlyData;
                            }
                        }
                        return null;
                    },
                    cookieName: 'cookie-test',
                    cookiePassword: 'test',
                },
            }),
        }),
    ],
})
export class AdminModule {}
 
const isAdmin = ({ currentAdmin }) => currentAdmin && currentAdmin.role === 'ADMIN';
 

함수로 만들어 파라미터로 넘겨주는 방법밖에 없을까요???

 

 

 

답변 1

답변을 작성해보세요.

1

안녕하세요 :)

더 좋은 방법이 있을지 모르겠지만 저도 함수로 따로 분리해서 작업했었습니다!

 

지태관님의 프로필

지태관

질문자

2021.11.20

넵 감사합니다!!!:)