@@ -39,6 +39,120 @@ func (ma *memberAPI) serve() {
39
39
mr .POST ("/setting" , ma .updateSetting )
40
40
mr .DELETE ("/:model/:id" , ma .delete )
41
41
mr .POST ("/logout" , ma .logout )
42
+ mr .GET ("/token" , ma .getToken )
43
+ mr .POST ("/token" , ma .issueNewToken )
44
+ mr .DELETE ("/token/:token" , ma .deleteToken )
45
+
46
+ // API
47
+ v1 := ma .r .Group ("v1" )
48
+ {
49
+ apiv1 := & apiV1 {v1 }
50
+ apiv1 .serve ()
51
+ }
52
+ }
53
+
54
+ type apiResult struct {
55
+ Token string `json:"token"`
56
+ Note string `json:"note"`
57
+ }
58
+
59
+ // getToken 获取 Token
60
+ func (ma * memberAPI ) getToken (c * gin.Context ) {
61
+ u := c .MustGet (model .CtxKeyAuthorizedUser ).(* model.User )
62
+ singleton .ApiLock .RLock ()
63
+ defer singleton .ApiLock .RUnlock ()
64
+
65
+ tokenList := singleton .UserIDToApiTokenList [u .ID ]
66
+ res := make ([]* apiResult , len (tokenList ))
67
+ for i , token := range tokenList {
68
+ res [i ] = & apiResult {
69
+ Token : token ,
70
+ Note : singleton .ApiTokenList [token ].Note ,
71
+ }
72
+ }
73
+ c .JSON (http .StatusOK , gin.H {
74
+ "code" : 0 ,
75
+ "message" : "success" ,
76
+ "result" : res ,
77
+ })
78
+ }
79
+
80
+ type TokenForm struct {
81
+ Note string
82
+ }
83
+
84
+ // issueNewToken 生成新的 token
85
+ func (ma * memberAPI ) issueNewToken (c * gin.Context ) {
86
+ u := c .MustGet (model .CtxKeyAuthorizedUser ).(* model.User )
87
+ tf := & TokenForm {}
88
+ err := c .ShouldBindJSON (tf )
89
+ if err != nil {
90
+ c .JSON (http .StatusOK , model.Response {
91
+ Code : http .StatusBadRequest ,
92
+ Message : fmt .Sprintf ("请求错误:%s" , err ),
93
+ })
94
+ return
95
+ }
96
+ token := & model.ApiToken {
97
+ UserID : u .ID ,
98
+ Token : utils .MD5 (fmt .Sprintf ("%d%d%s" , time .Now ().UnixNano (), u .ID , u .Login )),
99
+ Note : tf .Note ,
100
+ }
101
+ singleton .DB .Create (token )
102
+
103
+ singleton .ApiLock .Lock ()
104
+ singleton .ApiTokenList [token .Token ] = token
105
+ singleton .UserIDToApiTokenList [u .ID ] = append (singleton .UserIDToApiTokenList [u .ID ], token .Token )
106
+ singleton .ApiLock .Unlock ()
107
+
108
+ c .JSON (http .StatusOK , model.Response {
109
+ Code : http .StatusOK ,
110
+ Message : "success" ,
111
+ Result : map [string ]string {
112
+ "token" : token .Token ,
113
+ "note" : token .Note ,
114
+ },
115
+ })
116
+ }
117
+
118
+ // deleteToken 删除 token
119
+ func (ma * memberAPI ) deleteToken (c * gin.Context ) {
120
+ token := c .Param ("token" )
121
+ if token == "" {
122
+ c .JSON (http .StatusOK , model.Response {
123
+ Code : http .StatusBadRequest ,
124
+ Message : "token 不能为空" ,
125
+ })
126
+ return
127
+ }
128
+ singleton .ApiLock .Lock ()
129
+ defer singleton .ApiLock .Unlock ()
130
+ if _ , ok := singleton .ApiTokenList [token ]; ! ok {
131
+ c .JSON (http .StatusOK , model.Response {
132
+ Code : http .StatusBadRequest ,
133
+ Message : "token 不存在" ,
134
+ })
135
+ return
136
+ }
137
+ // 在数据库中删除该Token
138
+ singleton .DB .Unscoped ().Delete (& model.ApiToken {}, "token = ?" , token )
139
+
140
+ // 在UserIDToApiTokenList中删除该Token
141
+ for i , t := range singleton .UserIDToApiTokenList [singleton .ApiTokenList [token ].UserID ] {
142
+ if t == token {
143
+ singleton .UserIDToApiTokenList [singleton .ApiTokenList [token ].UserID ] = append (singleton .UserIDToApiTokenList [singleton .ApiTokenList [token ].UserID ][:i ], singleton .UserIDToApiTokenList [singleton .ApiTokenList [token ].UserID ][i + 1 :]... )
144
+ break
145
+ }
146
+ }
147
+ if len (singleton .UserIDToApiTokenList [singleton .ApiTokenList [token ].UserID ]) == 0 {
148
+ delete (singleton .UserIDToApiTokenList , singleton .ApiTokenList [token ].UserID )
149
+ }
150
+ // 在ApiTokenList中删除该Token
151
+ delete (singleton .ApiTokenList , token )
152
+ c .JSON (http .StatusOK , model.Response {
153
+ Code : http .StatusOK ,
154
+ Message : "success" ,
155
+ })
42
156
}
43
157
44
158
func (ma * memberAPI ) delete (c * gin.Context ) {
@@ -58,8 +172,21 @@ func (ma *memberAPI) delete(c *gin.Context) {
58
172
if err == nil {
59
173
// 删除服务器
60
174
singleton .ServerLock .Lock ()
175
+ tag := singleton .ServerList [id ].Tag
61
176
delete (singleton .SecretToID , singleton .ServerList [id ].Secret )
62
177
delete (singleton .ServerList , id )
178
+ index := 0
179
+ for index < len (singleton .ServerTagToIDList [tag ]) {
180
+ if singleton.ServerTagToIDList [tag ][index ] == id {
181
+ break
182
+ }
183
+ index ++
184
+ }
185
+ // 删除旧 Tag-ID 绑定关系
186
+ singleton .ServerTagToIDList [tag ] = append (singleton .ServerTagToIDList [tag ][:index ], singleton .ServerTagToIDList [tag ][index + 1 :]... )
187
+ if len (singleton .ServerTagToIDList [tag ]) == 0 {
188
+ delete (singleton .ServerTagToIDList , tag )
189
+ }
63
190
singleton .ServerLock .Unlock ()
64
191
singleton .ReSortServer ()
65
192
}
@@ -161,6 +288,23 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
161
288
// 设置新的 Secret-ID 绑定关系
162
289
delete (singleton .SecretToID , singleton .ServerList [s .ID ].Secret )
163
290
}
291
+ // 如果修改了Tag
292
+ if s .Tag != singleton .ServerList [s .ID ].Tag {
293
+ index := 0
294
+ for index < len (singleton .ServerTagToIDList [s .Tag ]) {
295
+ if singleton.ServerTagToIDList [s.Tag ][index ] == s .ID {
296
+ break
297
+ }
298
+ index ++
299
+ }
300
+ // 删除旧 Tag-ID 绑定关系
301
+ singleton .ServerTagToIDList [singleton .ServerList [s .ID ].Tag ] = append (singleton .ServerTagToIDList [singleton .ServerList [s .ID ].Tag ][:index ], singleton .ServerTagToIDList [singleton .ServerList [s .ID ].Tag ][index + 1 :]... )
302
+ // 设置新的 Tag-ID 绑定关系
303
+ singleton .ServerTagToIDList [s .Tag ] = append (singleton .ServerTagToIDList [s .Tag ], s .ID )
304
+ if len (singleton .ServerTagToIDList [s .Tag ]) == 0 {
305
+ delete (singleton .ServerTagToIDList , s .Tag )
306
+ }
307
+ }
164
308
singleton .ServerList [s .ID ] = & s
165
309
singleton .ServerLock .Unlock ()
166
310
} else {
@@ -169,6 +313,7 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) {
169
313
singleton .ServerLock .Lock ()
170
314
singleton .SecretToID [s .Secret ] = s .ID
171
315
singleton .ServerList [s .ID ] = & s
316
+ singleton .ServerTagToIDList [s .Tag ] = append (singleton .ServerTagToIDList [s .Tag ], s .ID )
172
317
singleton .ServerLock .Unlock ()
173
318
}
174
319
singleton .ReSortServer ()
0 commit comments