Git Product home page Git Product logo

gaelo_flow_backend's People

Stargazers

 avatar  avatar

Watchers

 avatar  avatar

gaelo_flow_backend's Issues

Role controlleur create

` async update(
@param('name') name: string,
@Body() roleDto: RoleDto,
): Promise {
const role = await this.roleService.findOneByOrFail(name);

const requiredKeys = [
  'import',
  'anonymize',
  'export',
  'query',
  'autoQuery',
  'delete',
  'admin',
  'modify',
  'cdBurner',
  'autoRouting',
];`

A faire via un DTO + validator plutot

Role controller

` async findAll(@query() withLabels: WithLabels): Promise<Role[]> {
const allRoles = await this.roleService.findAll();
if (withLabels.WithLabels) {
const allRoleLabels = await this.roleService.getAllRoleLabels();
allRoles.forEach((role) => {
role['labels'] = allRoleLabels
.filter((roleLabel) => roleLabel.Role.Name === role.Name)
.map((roleLabel) => roleLabel.Label.Name);
});
}

return allRoles;

}`

C'est pas fou comme factorisation, si tu a la propriété withLabel le mieux est d'avoir dans le roleService une méthode "findAllWithLabel" qui integrera la jointure directement
ou alors dans findAll ajouter un boolean withLabel pour avoir ou non la jointure

Ca permet de faire une seule requette sql au lieu de 2 et de ne pas avoir à refill la jointure dans ton controlleur

role controlleur

@UseInterceptors(NotFoundInterceptor) @Post('/:roleName/label') async addLabelToRole( @Param('roleName') roleName: string, @Body() labelDto: LabelDto, ): Promise<void> { const role = await this.roleService.findOneByOrFail(roleName);

Pas fou cette const role non utilisée, mieux de faire roleService.IsExiste(role) qui renvoit un boolean et le controlleur se charge de renvoyer 404 si le retour est false

Change user.entity / PUT

user.entity -> Remove property SuperAdmin and Username (use email for validation)

update-user.dto -> add Email, RoleName

getOauthConfig

` async getOauthConfig() {
const oauthConfig = await this.oauthConfigService.getOauthConfig();
const oauthConfigDto = {};
for (const config of oauthConfig) {
oauthConfigDto[config.Provider] = {
AuthorizationUrl: config.AuthorizationUrl,
ClientId: config.ClientId,
};
}

return oauthConfigDto;

}`

Pas sur qu'on ait besoin d'indexer les auth config par provider, on peut simplement rendre un array d'object avec Provider, AuthorizationUrl, ClientId

RBAC a designer

  • Refac OrGuards
  • Guard par ressource Orthanc
  • Guard DicomWeb

task.service

Dans cette class on a deux cron job qui ne font pas la meme chose avec des injection de dépendances différentes

Je pense qu'il faut mieux les dissocier dans deux fichiers, task-monitoring.service et task-autoquery.service
et referencer ces ceux dans le meme tasks.module qu'on a

Create User

// check if all the keys are present if ( !userDto.Firstname == undefined || !userDto.Lastname == undefined || !userDto.Username == undefined || !userDto.Email == undefined || !userDto.Password == undefined || !userDto.SuperAdmin == undefined || !userDto.RoleName == undefined ) { throw new BadRequestException('All the keys are required'); }

Ca devrait pas plutot etre verifié par le DTO ?

remove label from role non implémenté

@Delete('/:roleName/label/:label') async removeLabelFromRole( @Param('roleName') roleName: string, @Param('label') label: string, ): Promise<void> { console.log(roleName, label); }

RoleController

` const requiredKeys = [
'import',
'anonymize',
'export',
'query',
'autoQuery',
'delete',
'admin',
'modify',
'cdBurner',
'autoRouting',
];

requiredKeys.forEach((key) => {
  if (roleDto[key] === undefined) {
    throw new BadRequestException(`Missing key '${key}' in roleDto`);
  } else {
    role[key] = roleDto[key];
  }
});`

Pareil ca peut pas etre checké par un DTO ?

eviter les appel direct a bcrypt

`describe('UsersController (e2e)', () => {
let app: INestApplication;
let userRepository: Repository;

let adminToken: string = '';
let adminId: number = 0;

beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();

app = moduleFixture.createNestApplication();
await app.init();

userRepository = moduleFixture.get<Repository<User>>(
  getRepositoryToken(User),
);

const hash: string = await bcryptjs.hash(
  'passwordadmin',
  await bcryptjs.genSalt(),
);`

const hash: string = await bcryptjs.hash(
  'passwordadmin',
  await bcryptjs.genSalt(),
)

=> ici tu peux passer par les utils

TaskService

tu a besoin de lancer ca dans le constructeur ?
(async () => { this.lastChanges = (await this.orthancClient.getLastChanges()).data.Last; })();

Le every 10 sec il va pas le faire 10 secondes apres avoir construit le service de toute facon ? (car si ca met 10 secondes a faire le 1er appel c'est pas bien grave)

hash password

il y a ces lignes duplliquées plusieurs fois

const salt = await bcryptjs.genSalt(); const hash = await bcryptjs.hash(userDto.Password, salt);

Je pense qu'il vaut mieux encapsuter ca dans une fonction hashPassword, soit dans UserService soit dans les utils, et dans tes tests tu mock cette fonction pour renvoyer une string de ton choix pour tes tests, ca simplifiera le code et les tetss

Processing queue service remove job non implementé

async removeJob(jobData: object): Promise<void> { console.log(jobData); }

On aura besoin d'une route pour enlever un job processing (si il n'est pas démarré), faut implementer ce remove et ouvrir un controlleur pour delete un job processing (via son id)

Faire un wapper pour la validation des password

` async validateUser(username: string, pass: string): Promise {
const user = await this.usersService.findOneByUsername(username);

if (user && (await bcryptjs.compare(pass, user.Password))) {
  const { Password, ...result } = user;
  return result;
}
return null;

}`

Ici aussi plutot que de passer par bcrypt pour valider le password le faire dans un wrapper dans le utils qui renvoi un boolean si le password et le bon et comme ca tu pourra le mocker facilement pour les tests

contolleur option

async getOptions(): Promise<Option> { const options = await this.optionService.getOptions(); delete options.Id;

Pourquoi ne pas maquer le id comme on fait avec le password plutot que de le delete à la main ?

Password hidden

@Get('/:id') @UseInterceptors(NotFoundInterceptor) async getUsersId(@Param('id') id: number): Promise<GetUserDto> { const user = await this.UserService.findOne(id); return { ...user, Password: undefined }; }

Pareil ici je pense que soit le password est protégé via le Exclude de userDTO soit y doit y avoir un moyen de dire que GetUserDto est un UserDto moins le password (pour eviter de vider manuellement le password dans le controller)

Monitoring

On va avoir besoin d'un service de monitoring d'orthanc,

Le but de ce service va etre de surveiller Orthanc via son API change pour emmetre des event quand il y a un nouveau patient, study, series (en utilisant l'evenement onStable)

Differents autres services vont écouter ces evenements dans le but de :

  • Automatiquement faire des inferences suivant certaines regles
  • Faire de l'auto routing
  • (lancer une gravure)

mettre definitions des enums dans le repertoire constants

y a l'air d'avoir le repertoire constants qui est la de base pour définir toute les contants, y mettre nos enums (QueryAnswerType, TagPoliciesn ProcessingMaskEnum, ProcessingMaskEnum)

Les harmoniser je suis pas sur qu'il faille les faire finir par enum, regarder dans nest comment sont nommées leurs enums

Isoler les appels a bcrypt et crypto dans des fonction de hash

On a des appels a bcrypt et crypto un peu partout dans le code

J'ai fait un utils password pour isoler ces appels en une fonction de hashage et generation de token

Il faut updater le code pour utiliser ces fonction, ca permet de limiter les import de crypto et bcrypt et pour les test mocker ce utils plutot que de mocker crypto/bcrypt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.