@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.
- package/README.md +2 -10
- package/admin/src/pages/HomePage.jsx +109 -61
- package/admin/src/pages/SettingsPage.jsx +270 -97
- package/dist/_chunks/App-CuSCtdH7.js +666 -0
- package/dist/_chunks/App-vakyp6FE.mjs +666 -0
- package/dist/_chunks/{index-C18aSW5z.mjs → index-CZWWYGR3.mjs} +1 -1
- package/dist/_chunks/{index-CqpMwL_C.js → index-DGatQB-9.js} +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/server/index.js +160 -38
- package/dist/server/index.mjs +160 -38
- package/package.json +1 -1
- package/server/src/controllers/controller.js +58 -3
- package/server/src/routes/admin/index.js +25 -0
- package/server/src/services/service.js +113 -43
- package/dist/_chunks/App-3JntxPYv.js +0 -520
- package/dist/_chunks/App-C0Byi5W1.mjs +0 -520
|
@@ -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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
43
|
-
|
|
47
|
+
// Old format detected - migrate
|
|
48
|
+
if (settings.workflow || settings.branch) {
|
|
44
49
|
return {
|
|
45
|
-
|
|
46
|
-
githubToken:
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
hasToken: !!envToken,
|
|
60
|
-
maskedToken: this.maskToken(envToken),
|
|
73
|
+
...DEFAULT_SETTINGS,
|
|
74
|
+
hasToken: false,
|
|
75
|
+
maskedToken: null,
|
|
61
76
|
};
|
|
62
77
|
}
|
|
63
78
|
|
|
64
|
-
|
|
65
|
-
const token = dbSettings?.githubToken || envToken;
|
|
79
|
+
const token = dbSettings.githubToken;
|
|
66
80
|
return {
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
|
|
106
|
+
repoUrl: settingsToSave.repoUrl,
|
|
107
|
+
targets: settingsToSave.targets,
|
|
94
108
|
githubToken: undefined,
|
|
95
|
-
hasToken: !!settingsToSave.githubToken
|
|
109
|
+
hasToken: !!settingsToSave.githubToken,
|
|
110
|
+
maskedToken: this.maskToken(settingsToSave.githubToken),
|
|
96
111
|
};
|
|
97
112
|
},
|
|
98
113
|
|
|
99
|
-
async
|
|
100
|
-
// Priority: DB token > Environment variable
|
|
114
|
+
async addTarget(target) {
|
|
101
115
|
const store = strapi.store({ type: 'plugin', name: PLUGIN_ID });
|
|
102
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
126
|
+
settings.targets = [...(settings.targets || []), newTarget];
|
|
127
|
+
await store.set({ key: STORE_KEY, value: settings });
|
|
107
128
|
|
|
108
|
-
return
|
|
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
|
-
|
|
184
|
+
const hasTargets = settings.targets && settings.targets.length > 0;
|
|
185
|
+
return !!(owner && repo && hasToken && hasTargets);
|
|
116
186
|
},
|
|
117
187
|
|
|
118
188
|
async hasToken() {
|