@orange-soft/strapi-deployment-trigger 1.0.0 → 1.1.0

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.
@@ -33,5 +33,30 @@ export default () => ({
33
33
  policies: [],
34
34
  },
35
35
  },
36
+ // Target CRUD routes
37
+ {
38
+ method: 'POST',
39
+ path: '/targets',
40
+ handler: 'controller.addTarget',
41
+ config: {
42
+ policies: [],
43
+ },
44
+ },
45
+ {
46
+ method: 'PUT',
47
+ path: '/targets/:id',
48
+ handler: 'controller.updateTarget',
49
+ config: {
50
+ policies: [],
51
+ },
52
+ },
53
+ {
54
+ method: 'DELETE',
55
+ path: '/targets/:id',
56
+ handler: 'controller.deleteTarget',
57
+ config: {
58
+ policies: [],
59
+ },
60
+ },
36
61
  ],
37
62
  });
@@ -3,10 +3,12 @@ const STORE_KEY = 'settings';
3
3
 
4
4
  const DEFAULT_SETTINGS = {
5
5
  repoUrl: '',
6
- workflow: 'deploy.yml',
7
- branch: 'master',
6
+ githubToken: '',
7
+ targets: [],
8
8
  };
9
9
 
10
+ const generateId = () => Math.random().toString(36).substring(2, 9);
11
+
10
12
  const service = ({ strapi }) => ({
11
13
  getWelcomeMessage() {
12
14
  return 'Welcome to Strapi Deployment Trigger';
@@ -33,40 +35,52 @@ const service = ({ strapi }) => ({
33
35
  return { owner: null, repo: null };
34
36
  },
35
37
 
36
- async getSettings() {
37
- // 1. Try database (core store)
38
- const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
39
- const dbSettings = await store.get({ key: STORE_KEY });
40
- const envToken = process.env.GITHUB_PERSONAL_ACCESS_TOKEN;
38
+ // Migrate old single-config format to new multi-target format
39
+ migrateSettings(settings) {
40
+ if (!settings) return null;
41
+
42
+ // Already in new format
43
+ if (Array.isArray(settings.targets)) {
44
+ return settings;
45
+ }
41
46
 
42
- if (dbSettings && dbSettings.repoUrl) {
43
- const token = dbSettings.githubToken || envToken;
47
+ // Old format detected - migrate
48
+ if (settings.workflow || settings.branch) {
44
49
  return {
45
- ...dbSettings,
46
- githubToken: undefined, // Never expose full token
47
- hasToken: !!token,
48
- maskedToken: this.maskToken(token),
50
+ repoUrl: settings.repoUrl || '',
51
+ githubToken: settings.githubToken || '',
52
+ targets: [{
53
+ id: generateId(),
54
+ name: 'Default',
55
+ workflow: settings.workflow || 'deploy.yml',
56
+ branch: settings.branch || 'master',
57
+ }],
49
58
  };
50
59
  }
51
60
 
52
- // 2. Fallback to plugin config (convert old format if needed)
53
- const pluginConfig = strapi.config.get(`plugin::${PLUGIN_ID}`) || {};
54
- if (pluginConfig.githubOwner && pluginConfig.githubRepo) {
61
+ return settings;
62
+ },
63
+
64
+ async getSettings() {
65
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
66
+ let dbSettings = await store.get({ key: STORE_KEY });
67
+
68
+ // Migrate if needed
69
+ dbSettings = this.migrateSettings(dbSettings);
70
+
71
+ if (!dbSettings) {
55
72
  return {
56
- repoUrl: `https://github.com/${pluginConfig.githubOwner}/${pluginConfig.githubRepo}`,
57
- workflow: pluginConfig.workflow || DEFAULT_SETTINGS.workflow,
58
- branch: pluginConfig.branch || DEFAULT_SETTINGS.branch,
59
- hasToken: !!envToken,
60
- maskedToken: this.maskToken(envToken),
73
+ ...DEFAULT_SETTINGS,
74
+ hasToken: false,
75
+ maskedToken: null,
61
76
  };
62
77
  }
63
78
 
64
- // 3. Return defaults merged with any partial DB settings
65
- const token = dbSettings?.githubToken || envToken;
79
+ const token = dbSettings.githubToken;
66
80
  return {
67
- ...DEFAULT_SETTINGS,
68
- ...dbSettings,
69
- githubToken: undefined,
81
+ repoUrl: dbSettings.repoUrl || '',
82
+ targets: dbSettings.targets || [],
83
+ githubToken: undefined, // Never expose full token
70
84
  hasToken: !!token,
71
85
  maskedToken: this.maskToken(token),
72
86
  };
@@ -74,45 +88,101 @@ const service = ({ strapi }) => ({
74
88
 
75
89
  async saveSettings(settings) {
76
90
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
77
-
78
- // Get existing settings to preserve token if not provided
79
91
  const existingSettings = await store.get({ key: STORE_KEY }) || {};
80
92
 
93
+ // Migrate existing if needed
94
+ const migrated = this.migrateSettings(existingSettings);
95
+
81
96
  const settingsToSave = {
82
- repoUrl: settings.repoUrl,
83
- workflow: settings.workflow || DEFAULT_SETTINGS.workflow,
84
- branch: settings.branch || DEFAULT_SETTINGS.branch,
97
+ repoUrl: settings.repoUrl !== undefined ? settings.repoUrl : (migrated?.repoUrl || ''),
98
+ targets: settings.targets !== undefined ? settings.targets : (migrated?.targets || []),
85
99
  // Only update token if a new one is provided
86
- githubToken: settings.githubToken || existingSettings.githubToken,
100
+ githubToken: settings.githubToken || migrated?.githubToken || '',
87
101
  };
88
102
 
89
103
  await store.set({ key: STORE_KEY, value: settingsToSave });
90
104
 
91
- // Return without exposing token
92
105
  return {
93
- ...settingsToSave,
106
+ repoUrl: settingsToSave.repoUrl,
107
+ targets: settingsToSave.targets,
94
108
  githubToken: undefined,
95
- hasToken: !!settingsToSave.githubToken || !!process.env.GITHUB_PERSONAL_ACCESS_TOKEN,
109
+ hasToken: !!settingsToSave.githubToken,
110
+ maskedToken: this.maskToken(settingsToSave.githubToken),
96
111
  };
97
112
  },
98
113
 
99
- async getToken() {
100
- // Priority: DB token > Environment variable
114
+ async addTarget(target) {
101
115
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
102
- const dbSettings = await store.get({ key: STORE_KEY });
116
+ let settings = await store.get({ key: STORE_KEY }) || DEFAULT_SETTINGS;
117
+ settings = this.migrateSettings(settings) || DEFAULT_SETTINGS;
118
+
119
+ const newTarget = {
120
+ id: generateId(),
121
+ name: target.name || 'New Target',
122
+ workflow: target.workflow || 'deploy.yml',
123
+ branch: target.branch || 'master',
124
+ };
103
125
 
104
- if (dbSettings?.githubToken) {
105
- return dbSettings.githubToken;
106
- }
126
+ settings.targets = [...(settings.targets || []), newTarget];
127
+ await store.set({ key: STORE_KEY, value: settings });
107
128
 
108
- return process.env.GITHUB_PERSONAL_ACCESS_TOKEN;
129
+ return newTarget;
130
+ },
131
+
132
+ async updateTarget(targetId, updates) {
133
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
134
+ let settings = await store.get({ key: STORE_KEY });
135
+ settings = this.migrateSettings(settings);
136
+
137
+ if (!settings?.targets) return null;
138
+
139
+ const targetIndex = settings.targets.findIndex(t => t.id === targetId);
140
+ if (targetIndex === -1) return null;
141
+
142
+ settings.targets[targetIndex] = {
143
+ ...settings.targets[targetIndex],
144
+ ...updates,
145
+ id: targetId, // Preserve ID
146
+ };
147
+
148
+ await store.set({ key: STORE_KEY, value: settings });
149
+ return settings.targets[targetIndex];
150
+ },
151
+
152
+ async deleteTarget(targetId) {
153
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
154
+ let settings = await store.get({ key: STORE_KEY });
155
+ settings = this.migrateSettings(settings);
156
+
157
+ if (!settings?.targets) return false;
158
+
159
+ const initialLength = settings.targets.length;
160
+ settings.targets = settings.targets.filter(t => t.id !== targetId);
161
+
162
+ if (settings.targets.length === initialLength) return false;
163
+
164
+ await store.set({ key: STORE_KEY, value: settings });
165
+ return true;
166
+ },
167
+
168
+ async getTarget(targetId) {
169
+ const settings = await this.getSettings();
170
+ return settings.targets?.find(t => t.id === targetId) || null;
171
+ },
172
+
173
+ async getToken() {
174
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
175
+ let dbSettings = await store.get({ key: STORE_KEY });
176
+ dbSettings = this.migrateSettings(dbSettings);
177
+ return dbSettings?.githubToken || null;
109
178
  },
110
179
 
111
180
  async isConfigured() {
112
181
  const settings = await this.getSettings();
113
182
  const hasToken = await this.getToken();
114
183
  const { owner, repo } = this.parseRepoUrl(settings.repoUrl);
115
- return !!(owner && repo && hasToken);
184
+ const hasTargets = settings.targets && settings.targets.length > 0;
185
+ return !!(owner && repo && hasToken && hasTargets);
116
186
  },
117
187
 
118
188
  async hasToken() {