1
1
package streams
2
2
3
3
import (
4
+ "net/http"
5
+ "os"
6
+ "strings"
7
+ "time"
8
+
4
9
"github.com/0xJacky/Nginx-UI/api"
5
10
"github.com/0xJacky/Nginx-UI/internal/config"
6
- "github.com/0xJacky/Nginx-UI/internal/helper"
7
11
"github.com/0xJacky/Nginx-UI/internal/nginx"
12
+ "github.com/0xJacky/Nginx-UI/internal/stream"
8
13
"github.com/0xJacky/Nginx-UI/query"
9
14
"github.com/gin-gonic/gin"
10
15
"github.com/sashabaranov/go-openai"
11
16
"github.com/uozi-tech/cosy"
12
- "net/http"
13
- "os"
14
- "strings"
15
- "time"
16
17
)
17
18
18
19
type Stream struct {
@@ -24,6 +25,7 @@ type Stream struct {
24
25
ChatGPTMessages []openai.ChatCompletionMessage `json:"chatgpt_messages,omitempty"`
25
26
Tokenized * nginx.NgxConfig `json:"tokenized,omitempty"`
26
27
Filepath string `json:"filepath"`
28
+ SyncNodeIDs []uint64 `json:"sync_node_ids" gorm:"serializer:json"`
27
29
}
28
30
29
31
func GetStreams (c * gin.Context ) {
@@ -32,14 +34,12 @@ func GetStreams(c *gin.Context) {
32
34
sort := c .DefaultQuery ("sort" , "desc" )
33
35
34
36
configFiles , err := os .ReadDir (nginx .GetConfPath ("streams-available" ))
35
-
36
37
if err != nil {
37
38
api .ErrHandler (c , err )
38
39
return
39
40
}
40
41
41
42
enabledConfig , err := os .ReadDir (nginx .GetConfPath ("streams-enabled" ))
42
-
43
43
if err != nil {
44
44
api .ErrHandler (c , err )
45
45
return
@@ -77,15 +77,8 @@ func GetStreams(c *gin.Context) {
77
77
}
78
78
79
79
func GetStream (c * gin.Context ) {
80
- rewriteName , ok := c .Get ("rewriteConfigFileName" )
81
-
82
80
name := c .Param ("name" )
83
81
84
- // for modify filename
85
- if ok {
86
- name = rewriteName .(string )
87
- }
88
-
89
82
path := nginx .GetConfPath ("streams-available" , name )
90
83
file , err := os .Stat (path )
91
84
if os .IsNotExist (err ) {
@@ -114,14 +107,13 @@ func GetStream(c *gin.Context) {
114
107
}
115
108
116
109
s := query .Stream
117
- stream , err := s .Where (s .Path .Eq (path )).FirstOrInit ()
118
-
110
+ streamModel , err := s .Where (s .Path .Eq (path )).FirstOrCreate ()
119
111
if err != nil {
120
112
api .ErrHandler (c , err )
121
113
return
122
114
}
123
115
124
- if stream .Advanced {
116
+ if streamModel .Advanced {
125
117
origContent , err := os .ReadFile (path )
126
118
if err != nil {
127
119
api .ErrHandler (c , err )
@@ -130,12 +122,13 @@ func GetStream(c *gin.Context) {
130
122
131
123
c .JSON (http .StatusOK , Stream {
132
124
ModifiedAt : file .ModTime (),
133
- Advanced : stream .Advanced ,
125
+ Advanced : streamModel .Advanced ,
134
126
Enabled : enabled ,
135
127
Name : name ,
136
128
Config : string (origContent ),
137
129
ChatGPTMessages : chatgpt .Content ,
138
130
Filepath : path ,
131
+ SyncNodeIDs : streamModel .SyncNodeIDs ,
139
132
})
140
133
return
141
134
}
@@ -149,207 +142,86 @@ func GetStream(c *gin.Context) {
149
142
150
143
c .JSON (http .StatusOK , Stream {
151
144
ModifiedAt : file .ModTime (),
152
- Advanced : stream .Advanced ,
145
+ Advanced : streamModel .Advanced ,
153
146
Enabled : enabled ,
154
147
Name : name ,
155
148
Config : nginxConfig .FmtCode (),
156
149
Tokenized : nginxConfig ,
157
150
ChatGPTMessages : chatgpt .Content ,
158
151
Filepath : path ,
152
+ SyncNodeIDs : streamModel .SyncNodeIDs ,
159
153
})
160
154
}
161
155
162
156
func SaveStream (c * gin.Context ) {
163
157
name := c .Param ("name" )
164
158
165
- if name == "" {
166
- c .JSON (http .StatusNotAcceptable , gin.H {
167
- "message" : "param name is empty" ,
168
- })
169
- return
170
- }
171
-
172
159
var json struct {
173
- Name string `json:"name " binding:"required"`
174
- Content string `json:"content" binding:"required "`
175
- Overwrite bool `json:"overwrite"`
160
+ Content string `json:"content " binding:"required"`
161
+ SyncNodeIDs [] uint64 `json:"sync_node_ids "`
162
+ Overwrite bool `json:"overwrite"`
176
163
}
177
164
178
165
if ! cosy .BindAndValid (c , & json ) {
179
166
return
180
167
}
181
168
182
- path := nginx .GetConfPath ("streams-available" , name )
183
-
184
- if ! json .Overwrite && helper .FileExists (path ) {
185
- c .JSON (http .StatusNotAcceptable , gin.H {
186
- "message" : "File exists" ,
187
- })
188
- return
189
- }
190
-
191
- err := os .WriteFile (path , []byte (json .Content ), 0644 )
169
+ err := stream .Save (name , json .Content , json .Overwrite , json .SyncNodeIDs )
192
170
if err != nil {
193
171
api .ErrHandler (c , err )
194
172
return
195
173
}
196
- enabledConfigFilePath := nginx .GetConfPath ("streams-enabled" , name )
197
- // rename the config file if needed
198
- if name != json .Name {
199
- newPath := nginx .GetConfPath ("streams-available" , json .Name )
200
- s := query .Stream
201
- _ , err = s .Where (s .Path .Eq (path )).Update (s .Path , newPath )
202
-
203
- // check if dst file exists, do not rename
204
- if helper .FileExists (newPath ) {
205
- c .JSON (http .StatusNotAcceptable , gin.H {
206
- "message" : "File exists" ,
207
- })
208
- return
209
- }
210
- // recreate a soft link
211
- if helper .FileExists (enabledConfigFilePath ) {
212
- _ = os .Remove (enabledConfigFilePath )
213
- enabledConfigFilePath = nginx .GetConfPath ("streams-enabled" , json .Name )
214
- err = os .Symlink (newPath , enabledConfigFilePath )
215
-
216
- if err != nil {
217
- api .ErrHandler (c , err )
218
- return
219
- }
220
- }
221
-
222
- err = os .Rename (path , newPath )
223
- if err != nil {
224
- api .ErrHandler (c , err )
225
- return
226
- }
227
-
228
- name = json .Name
229
- c .Set ("rewriteConfigFileName" , name )
230
- }
231
-
232
- enabledConfigFilePath = nginx .GetConfPath ("streams-enabled" , name )
233
- if helper .FileExists (enabledConfigFilePath ) {
234
- // Test nginx configuration
235
- output := nginx .TestConf ()
236
-
237
- if nginx .GetLogLevel (output ) > nginx .Warn {
238
- c .JSON (http .StatusInternalServerError , gin.H {
239
- "message" : output ,
240
- })
241
- return
242
- }
243
-
244
- output = nginx .Reload ()
245
-
246
- if nginx .GetLogLevel (output ) > nginx .Warn {
247
- c .JSON (http .StatusInternalServerError , gin.H {
248
- "message" : output ,
249
- })
250
- return
251
- }
252
- }
253
174
254
175
GetStream (c )
255
176
}
256
177
257
178
func EnableStream (c * gin.Context ) {
258
- configFilePath := nginx .GetConfPath ("streams-available" , c .Param ("name" ))
259
- enabledConfigFilePath := nginx .GetConfPath ("streams-enabled" , c .Param ("name" ))
260
-
261
- _ , err := os .Stat (configFilePath )
262
-
179
+ err := stream .Enable (c .Param ("name" ))
263
180
if err != nil {
264
181
api .ErrHandler (c , err )
265
182
return
266
183
}
267
184
268
- if _ , err = os .Stat (enabledConfigFilePath ); os .IsNotExist (err ) {
269
- err = os .Symlink (configFilePath , enabledConfigFilePath )
270
-
271
- if err != nil {
272
- api .ErrHandler (c , err )
273
- return
274
- }
275
- }
276
-
277
- // Test nginx config, if not pass, then disable the stream.
278
- output := nginx .TestConf ()
279
-
280
- if nginx .GetLogLevel (output ) > nginx .Warn {
281
- _ = os .Remove (enabledConfigFilePath )
282
- c .JSON (http .StatusInternalServerError , gin.H {
283
- "message" : output ,
284
- })
285
- return
286
- }
287
-
288
- output = nginx .Reload ()
289
-
290
- if nginx .GetLogLevel (output ) > nginx .Warn {
291
- c .JSON (http .StatusInternalServerError , gin.H {
292
- "message" : output ,
293
- })
294
- return
295
- }
296
-
297
185
c .JSON (http .StatusOK , gin.H {
298
186
"message" : "ok" ,
299
187
})
300
188
}
301
189
302
190
func DisableStream (c * gin.Context ) {
303
- enabledConfigFilePath := nginx .GetConfPath ("streams-enabled" , c .Param ("name" ))
304
-
305
- _ , err := os .Stat (enabledConfigFilePath )
306
-
191
+ err := stream .Disable (c .Param ("name" ))
307
192
if err != nil {
308
193
api .ErrHandler (c , err )
309
194
return
310
195
}
311
196
312
- err = os .Remove (enabledConfigFilePath )
197
+ c .JSON (http .StatusOK , gin.H {
198
+ "message" : "ok" ,
199
+ })
200
+ }
313
201
202
+ func DeleteStream (c * gin.Context ) {
203
+ err := stream .Delete (c .Param ("name" ))
314
204
if err != nil {
315
205
api .ErrHandler (c , err )
316
206
return
317
207
}
318
- output := nginx .Reload ()
319
-
320
- if nginx .GetLogLevel (output ) > nginx .Warn {
321
- c .JSON (http .StatusInternalServerError , gin.H {
322
- "message" : output ,
323
- })
324
- return
325
- }
326
208
327
209
c .JSON (http .StatusOK , gin.H {
328
210
"message" : "ok" ,
329
211
})
330
212
}
331
213
332
- func DeleteStream (c * gin.Context ) {
333
- var err error
334
- name := c .Param ("name" )
335
- availablePath := nginx .GetConfPath ("streams-available" , name )
336
- enabledPath := nginx .GetConfPath ("streams-enabled" , name )
337
-
338
- if _ , err = os .Stat (availablePath ); os .IsNotExist (err ) {
339
- c .JSON (http .StatusNotFound , gin.H {
340
- "message" : "stream not found" ,
341
- })
342
- return
214
+ func RenameStream (c * gin.Context ) {
215
+ oldName := c .Param ("name" )
216
+ var json struct {
217
+ NewName string `json:"new_name"`
343
218
}
344
-
345
- if _ , err = os .Stat (enabledPath ); err == nil {
346
- c .JSON (http .StatusNotAcceptable , gin.H {
347
- "message" : "stream is enabled" ,
348
- })
219
+ if ! cosy .BindAndValid (c , & json ) {
349
220
return
350
221
}
351
222
352
- if err = os .Remove (availablePath ); err != nil {
223
+ err := stream .Rename (oldName , json .NewName )
224
+ if err != nil {
353
225
api .ErrHandler (c , err )
354
226
return
355
227
}
0 commit comments