github.com/argoproj/argo-cd/v2@v2.10.9/ui/src/app/shared/services/projects-service.ts (about)

     1  import requests from './requests';
     2  
     3  import * as models from '../models';
     4  
     5  export interface CreateJWTTokenParams {
     6      project: string;
     7      role: string;
     8      expiresIn: number;
     9  }
    10  
    11  export interface DeleteJWTTokenParams {
    12      project: string;
    13      role: string;
    14      iat: number;
    15  }
    16  
    17  export interface JWTTokenResponse {
    18      token: string;
    19  }
    20  
    21  export interface ProjectSyncWindowsParams {
    22      projName: string;
    23      id: number;
    24      window: models.SyncWindow;
    25      deleteWindow: boolean;
    26  }
    27  
    28  export interface ProjectRoleParams {
    29      projName: string;
    30      roleName: string;
    31      description: string;
    32      policies: string[] | string;
    33      jwtTokens: models.JwtToken[];
    34      groups: string[];
    35      deleteRole: boolean;
    36      expiresIn: string;
    37  }
    38  
    39  function paramsToProjRole(params: ProjectRoleParams): models.ProjectRole {
    40      let newPolicies = [] as string[];
    41      if (typeof params.policies === 'string') {
    42          if (params.policies !== '') {
    43              newPolicies = params.policies.split('\n');
    44          }
    45      } else {
    46          newPolicies = params.policies;
    47      }
    48      return {
    49          name: params.roleName,
    50          description: params.description,
    51          policies: newPolicies,
    52          groups: params.groups
    53      };
    54  }
    55  
    56  export class ProjectsService {
    57      public list(...fields: string[]): Promise<models.Project[]> {
    58          return requests
    59              .get('/projects')
    60              .query({fields: fields.join(',')})
    61              .then(res => res.body as models.ProjectList)
    62              .then(list => list.items || []);
    63      }
    64  
    65      public get(name: string): Promise<models.Project> {
    66          return requests.get(`/projects/${name}`).then(res => res.body as models.Project);
    67      }
    68  
    69      public getDetailed(name: string): Promise<models.DetailedProjectsResponse> {
    70          return requests.get(`/projects/${name}/detailed`).then(res => res.body as models.DetailedProjectsResponse);
    71      }
    72  
    73      public getGlobalProjects(name: string): Promise<models.Project[]> {
    74          return requests.get(`/projects/${name}/globalprojects`).then(res => res.body.items as models.Project[]);
    75      }
    76  
    77      public delete(name: string): Promise<boolean> {
    78          return requests.delete(`/projects/${name}`).then(() => true);
    79      }
    80  
    81      public create(project: models.Project): Promise<models.Project> {
    82          return requests
    83              .post('/projects')
    84              .send({project})
    85              .then(res => res.body as models.Project);
    86      }
    87  
    88      public async update(project: models.Project): Promise<models.Project> {
    89          return requests
    90              .put(`/projects/${project.metadata.name}`)
    91              .send({project})
    92              .then(res => res.body as models.Project);
    93      }
    94  
    95      public getSyncWindows(name: string): Promise<models.SyncWindowsState> {
    96          return requests
    97              .get(`/projects/${name}/syncwindows`)
    98              .query({name})
    99              .then(res => res.body as models.SyncWindowsState);
   100      }
   101  
   102      public async updateWindow(params: ProjectSyncWindowsParams): Promise<models.Project> {
   103          const proj = await this.get(params.projName);
   104          const updatedSpec = proj.spec;
   105          if (proj.spec.syncWindows === undefined) {
   106              updatedSpec.syncWindows = [];
   107          }
   108          if (params.id === undefined || !(params.id in proj.spec.syncWindows)) {
   109              updatedSpec.syncWindows = updatedSpec.syncWindows.concat(params.window);
   110          } else {
   111              if (params.deleteWindow) {
   112                  updatedSpec.syncWindows.splice(params.id, 1);
   113              } else {
   114                  updatedSpec.syncWindows[params.id] = params.window;
   115              }
   116          }
   117  
   118          return requests
   119              .put(`/projects/${params.projName}`)
   120              .send({project: {...proj, spec: updatedSpec}})
   121              .then(res => res.body as models.Project);
   122      }
   123  
   124      public async updateRole(params: ProjectRoleParams): Promise<models.Project> {
   125          const proj = await this.get(params.projName);
   126          const updatedRole = paramsToProjRole(params);
   127          let roleExist = false;
   128          if (proj.spec.roles === undefined) {
   129              proj.spec.roles = [];
   130          }
   131          const updatedSpec = proj.spec;
   132  
   133          for (let i = 0; i < proj.spec.roles.length; i++) {
   134              if (proj.spec.roles[i].name === params.roleName) {
   135                  roleExist = true;
   136                  if (params.deleteRole) {
   137                      updatedSpec.roles.splice(i, 1);
   138                      break;
   139                  }
   140                  updatedSpec.roles[i] = updatedRole;
   141              }
   142          }
   143          if (!roleExist) {
   144              if (updatedSpec.roles === undefined) {
   145                  updatedSpec.roles = [];
   146              }
   147              updatedSpec.roles = updatedSpec.roles.concat(updatedRole);
   148          }
   149          return requests
   150              .put(`/projects/${params.projName}`)
   151              .send({project: {...proj, spec: updatedSpec}})
   152              .then(res => res.body as models.Project);
   153      }
   154  
   155      public async createJWTToken(params: CreateJWTTokenParams): Promise<JWTTokenResponse> {
   156          return requests
   157              .post(`/projects/${params.project}/roles/${params.role}/token`)
   158              .send(params)
   159              .then(res => res.body as JWTTokenResponse);
   160      }
   161  
   162      public async deleteJWTToken(params: DeleteJWTTokenParams): Promise<boolean> {
   163          return requests
   164              .delete(`/projects/${params.project}/roles/${params.role}/token/${params.iat}`)
   165              .send()
   166              .then(() => true);
   167      }
   168  
   169      public events(projectName: string): Promise<models.Event[]> {
   170          return requests
   171              .get(`/projects/${projectName}/events`)
   172              .send()
   173              .then(res => (res.body as models.EventList).items || []);
   174      }
   175  
   176      public getLinks(projectName: string): Promise<models.LinksResponse> {
   177          return requests
   178              .get(`/projects/${projectName}/links`)
   179              .send()
   180              .then(res => res.body as models.LinksResponse);
   181      }
   182  }