@orange-soft/strapi-deployment-trigger 1.0.1 → 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.
@@ -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,52 @@ 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 });
39
67
 
40
- if (dbSettings && dbSettings.repoUrl) {
41
- const token = dbSettings.githubToken;
68
+ // Migrate if needed
69
+ dbSettings = this.migrateSettings(dbSettings);
70
+
71
+ if (!dbSettings) {
42
72
  return {
43
- ...dbSettings,
44
- githubToken: undefined, // Never expose full token
45
- hasToken: !!token,
46
- maskedToken: this.maskToken(token),
73
+ ...DEFAULT_SETTINGS,
74
+ hasToken: false,
75
+ maskedToken: null,
47
76
  };
48
77
  }
49
78
 
50
- // Return defaults merged with any partial DB settings
51
- const token = dbSettings?.githubToken;
79
+ const token = dbSettings.githubToken;
52
80
  return {
53
- ...DEFAULT_SETTINGS,
54
- ...dbSettings,
55
- githubToken: undefined,
81
+ repoUrl: dbSettings.repoUrl || '',
82
+ targets: dbSettings.targets || [],
83
+ githubToken: undefined, // Never expose full token
56
84
  hasToken: !!token,
57
85
  maskedToken: this.maskToken(token),
58
86
  };
@@ -60,31 +88,92 @@ const service = ({ strapi }) => ({
60
88
 
61
89
  async saveSettings(settings) {
62
90
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
63
-
64
- // Get existing settings to preserve token if not provided
65
91
  const existingSettings = await store.get({ key: STORE_KEY }) || {};
66
92
 
93
+ // Migrate existing if needed
94
+ const migrated = this.migrateSettings(existingSettings);
95
+
67
96
  const settingsToSave = {
68
- repoUrl: settings.repoUrl,
69
- workflow: settings.workflow || DEFAULT_SETTINGS.workflow,
70
- branch: settings.branch || DEFAULT_SETTINGS.branch,
97
+ repoUrl: settings.repoUrl !== undefined ? settings.repoUrl : (migrated?.repoUrl || ''),
98
+ targets: settings.targets !== undefined ? settings.targets : (migrated?.targets || []),
71
99
  // Only update token if a new one is provided
72
- githubToken: settings.githubToken || existingSettings.githubToken,
100
+ githubToken: settings.githubToken || migrated?.githubToken || '',
73
101
  };
74
102
 
75
103
  await store.set({ key: STORE_KEY, value: settingsToSave });
76
104
 
77
- // Return without exposing token
78
105
  return {
79
- ...settingsToSave,
106
+ repoUrl: settingsToSave.repoUrl,
107
+ targets: settingsToSave.targets,
80
108
  githubToken: undefined,
81
109
  hasToken: !!settingsToSave.githubToken,
110
+ maskedToken: this.maskToken(settingsToSave.githubToken),
111
+ };
112
+ },
113
+
114
+ async addTarget(target) {
115
+ const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
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
+ };
125
+
126
+ settings.targets = [...(settings.targets || []), newTarget];
127
+ await store.set({ key: STORE_KEY, value: settings });
128
+
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
82
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;
83
171
  },
84
172
 
85
173
  async getToken() {
86
174
  const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
87
- const dbSettings = await store.get({ key: STORE_KEY });
175
+ let dbSettings = await store.get({ key: STORE_KEY });
176
+ dbSettings = this.migrateSettings(dbSettings);
88
177
  return dbSettings?.githubToken || null;
89
178
  },
90
179
 
@@ -92,7 +181,8 @@ const service = ({ strapi }) => ({
92
181
  const settings = await this.getSettings();
93
182
  const hasToken = await this.getToken();
94
183
  const { owner, repo } = this.parseRepoUrl(settings.repoUrl);
95
- return !!(owner && repo && hasToken);
184
+ const hasTargets = settings.targets && settings.targets.length > 0;
185
+ return !!(owner && repo && hasToken && hasTargets);
96
186
  },
97
187
 
98
188
  async hasToken() {