1import axios from 'axios';
2import { Task, TaskRunner } from './task';
3
4interface SearchTestDataSetupOptions {
5  count: number;
6}
7
8const client = axios.create({
9  baseURL: 'http://localhost:3000/api',
10  auth: {
11    username: 'admin',
12    password: 'admin2',
13  },
14});
15
16export async function getUser(user: any): Promise<any> {
17  console.log('Creating user ' + user.name);
18  const search = await client.get('/users/search', {
19    params: { query: user.login },
20  });
21
22  if (search.data.totalCount === 1) {
23    user.id = search.data.users[0].id;
24    return user;
25  }
26
27  const rsp = await client.post('/admin/users', user);
28  user.id = rsp.data.id;
29  return user;
30}
31
32export async function getTeam(team: any): Promise<any> {
33  // delete if exists
34  const teams = await client.get('/teams/search');
35  for (const existing of teams.data.teams) {
36    if (existing.name === team.name) {
37      console.log('Team exists, deleting');
38      await client.delete('/teams/' + existing.id);
39    }
40  }
41
42  console.log('Creating team ' + team.name);
43  const teamRsp = await client.post(`/teams`, team);
44  team.id = teamRsp.data.teamId;
45  return team;
46}
47
48export async function addToTeam(team: any, user: any): Promise<any> {
49  console.log(`Adding user ${user.name} to team ${team.name}`);
50  await client.post(`/teams/${team.id}/members`, { userId: user.id });
51}
52
53export async function setDashboardAcl(dashboardId: any, aclList: any) {
54  console.log('Setting Dashboard ACL ' + dashboardId);
55  await client.post(`/dashboards/id/${dashboardId}/permissions`, { items: aclList });
56}
57
58const searchTestDataSetupRunner: TaskRunner<SearchTestDataSetupOptions> = async ({ count }) => {
59  const user1 = await getUser({
60    name: 'searchTestUser1',
61    email: 'searchTestUser@team.com',
62    login: 'searchTestUser1',
63    password: '12345',
64  });
65
66  const team1 = await getTeam({ name: 'searchTestTeam1', email: 'searchtestdata@team.com' });
67  addToTeam(team1, user1);
68
69  // create or update folder
70  const folder: any = {
71    uid: 'search-test-data',
72    title: 'Search test data folder',
73    version: 1,
74  };
75
76  try {
77    await client.delete(`/folders/${folder.uid}`);
78  } catch (err) {}
79
80  console.log('Creating folder');
81
82  const rsp = await client.post(`/folders`, folder);
83  folder.id = rsp.data.id;
84  folder.url = rsp.data.url;
85
86  await setDashboardAcl(folder.id, []);
87
88  console.log('Creating dashboards');
89
90  const dashboards: any = [];
91
92  for (let i = 0; i < count; i++) {
93    const dashboard: any = {
94      uid: 'search-test-dash-' + i.toString().padStart(5, '0'),
95      title: 'Search test dash ' + i.toString().padStart(5, '0'),
96    };
97
98    const rsp = await client.post(`/dashboards/db`, {
99      dashboard: dashboard,
100      folderId: folder.id,
101      overwrite: true,
102    });
103
104    dashboard.id = rsp.data.id;
105    dashboard.url = rsp.data.url;
106
107    console.log('Created dashboard ' + dashboard.title);
108    dashboards.push(dashboard);
109    await setDashboardAcl(dashboard.id, [{ userId: 0, teamId: team1.id, permission: 4 }]);
110  }
111};
112
113export const searchTestDataSetupTask = new Task<SearchTestDataSetupOptions>(
114  'Search test data setup',
115  searchTestDataSetupRunner
116);
117