@orange-soft/strapi-deployment-trigger 1.0.1 → 1.1.2

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.
@@ -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,26 +35,60 @@ const service = ({ strapi }) => ({
33
35
  return { owner: null, repo: null };
34
36
  },
35
37
 
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
+ }
46
+
47
+ // Old format detected - migrate
48
+ if (settings.workflow || settings.branch) {
49
+ return {
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
+ }],
58
+ };
59
+ }
60
+
61
+ return settings;
62
+ },
63
+
36
64
  async getSettings() {
37
65
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
38
- const dbSettings = await store.get({ key: STORE_KEY });
66
+ let dbSettings = await store.get({ key: STORE_KEY });
67
+
68
+ // Check if migration is needed (old format has workflow/branch but no targets array)
69
+ const needsMigration = dbSettings && !Array.isArray(dbSettings.targets) && (dbSettings.workflow || dbSettings.branch);
39
70
 
40
- if (dbSettings && dbSettings.repoUrl) {
41
- const token = dbSettings.githubToken;
71
+ // Migrate if needed
72
+ dbSettings = this.migrateSettings(dbSettings);
73
+
74
+ // Persist the migration so IDs remain stable
75
+ if (needsMigration && dbSettings) {
76
+ await store.set({ key: STORE_KEY, value: dbSettings });
77
+ }
78
+
79
+ if (!dbSettings) {
42
80
  return {
43
- ...dbSettings,
44
- githubToken: undefined, // Never expose full token
45
- hasToken: !!token,
46
- maskedToken: this.maskToken(token),
81
+ ...DEFAULT_SETTINGS,
82
+ hasToken: false,
83
+ maskedToken: null,
47
84
  };
48
85
  }
49
86
 
50
- // Return defaults merged with any partial DB settings
51
- const token = dbSettings?.githubToken;
87
+ const token = dbSettings.githubToken;
52
88
  return {
53
- ...DEFAULT_SETTINGS,
54
- ...dbSettings,
55
- githubToken: undefined,
89
+ repoUrl: dbSettings.repoUrl || '',
90
+ targets: dbSettings.targets || [],
91
+ githubToken: undefined, // Never expose full token
56
92
  hasToken: !!token,
57
93
  maskedToken: this.maskToken(token),
58
94
  };
@@ -60,31 +96,92 @@ const service = ({ strapi }) => ({
60
96
 
61
97
  async saveSettings(settings) {
62
98
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
63
-
64
- // Get existing settings to preserve token if not provided
65
99
  const existingSettings = await store.get({ key: STORE_KEY }) || {};
66
100
 
101
+ // Migrate existing if needed
102
+ const migrated = this.migrateSettings(existingSettings);
103
+
67
104
  const settingsToSave = {
68
- repoUrl: settings.repoUrl,
69
- workflow: settings.workflow || DEFAULT_SETTINGS.workflow,
70
- branch: settings.branch || DEFAULT_SETTINGS.branch,
105
+ repoUrl: settings.repoUrl !== undefined ? settings.repoUrl : (migrated?.repoUrl || ''),
106
+ targets: settings.targets !== undefined ? settings.targets : (migrated?.targets || []),
71
107
  // Only update token if a new one is provided
72
- githubToken: settings.githubToken || existingSettings.githubToken,
108
+ githubToken: settings.githubToken || migrated?.githubToken || '',
73
109
  };
74
110
 
75
111
  await store.set({ key: STORE_KEY, value: settingsToSave });
76
112
 
77
- // Return without exposing token
78
113
  return {
79
- ...settingsToSave,
114
+ repoUrl: settingsToSave.repoUrl,
115
+ targets: settingsToSave.targets,
80
116
  githubToken: undefined,
81
117
  hasToken: !!settingsToSave.githubToken,
118
+ maskedToken: this.maskToken(settingsToSave.githubToken),
119
+ };
120
+ },
121
+
122
+ async addTarget(target) {
123
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
124
+ let settings = await store.get({ key: STORE_KEY }) || DEFAULT_SETTINGS;
125
+ settings = this.migrateSettings(settings) || DEFAULT_SETTINGS;
126
+
127
+ const newTarget = {
128
+ id: generateId(),
129
+ name: target.name || 'New Target',
130
+ workflow: target.workflow || 'deploy.yml',
131
+ branch: target.branch || 'master',
82
132
  };
133
+
134
+ settings.targets = [...(settings.targets || []), newTarget];
135
+ await store.set({ key: STORE_KEY, value: settings });
136
+
137
+ return newTarget;
138
+ },
139
+
140
+ async updateTarget(targetId, updates) {
141
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
142
+ let settings = await store.get({ key: STORE_KEY });
143
+ settings = this.migrateSettings(settings);
144
+
145
+ if (!settings?.targets) return null;
146
+
147
+ const targetIndex = settings.targets.findIndex(t => t.id === targetId);
148
+ if (targetIndex === -1) return null;
149
+
150
+ settings.targets[targetIndex] = {
151
+ ...settings.targets[targetIndex],
152
+ ...updates,
153
+ id: targetId, // Preserve ID
154
+ };
155
+
156
+ await store.set({ key: STORE_KEY, value: settings });
157
+ return settings.targets[targetIndex];
158
+ },
159
+
160
+ async deleteTarget(targetId) {
161
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
162
+ let settings = await store.get({ key: STORE_KEY });
163
+ settings = this.migrateSettings(settings);
164
+
165
+ if (!settings?.targets) return false;
166
+
167
+ const initialLength = settings.targets.length;
168
+ settings.targets = settings.targets.filter(t => t.id !== targetId);
169
+
170
+ if (settings.targets.length === initialLength) return false;
171
+
172
+ await store.set({ key: STORE_KEY, value: settings });
173
+ return true;
174
+ },
175
+
176
+ async getTarget(targetId) {
177
+ const settings = await this.getSettings();
178
+ return settings.targets?.find(t => t.id === targetId) || null;
83
179
  },
84
180
 
85
181
  async getToken() {
86
182
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
87
- const dbSettings = await store.get({ key: STORE_KEY });
183
+ let dbSettings = await store.get({ key: STORE_KEY });
184
+ dbSettings = this.migrateSettings(dbSettings);
88
185
  return dbSettings?.githubToken || null;
89
186
  },
90
187
 
@@ -92,7 +189,8 @@ const service = ({ strapi }) => ({
92
189
  const settings = await this.getSettings();
93
190
  const hasToken = await this.getToken();
94
191
  const { owner, repo } = this.parseRepoUrl(settings.repoUrl);
95
- return !!(owner && repo && hasToken);
192
+ const hasTargets = settings.targets && settings.targets.length > 0;
193
+ return !!(owner && repo && hasToken && hasTargets);
96
194
  },
97
195
 
98
196
  async hasToken() {