github.com/swishcloud/filesync@v0.0.0-20231002120458-6ade2feed6f9/internal/internal.go (about) 1 package internal 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "io/ioutil" 9 "log" 10 "net/http" 11 "net/url" 12 "os" 13 "strconv" 14 15 "github.com/swishcloud/filesync/storage/models" 16 "github.com/swishcloud/gostudy/common" 17 "golang.org/x/oauth2" 18 "gopkg.in/yaml.v2" 19 ) 20 21 type globalConfig struct { 22 BaseApiUrlPath string 23 AuthUrl string 24 TokenURL string 25 WebServerTcpAddess string 26 RedirectURL string 27 } 28 29 const TokenHeaderKey = "access_token" 30 31 var token_save_path = ".cache/token" 32 33 var httpClient *http.Client 34 35 func Initialize(c *http.Client) { 36 httpClient = c 37 } 38 func HttpClient() *http.Client { 39 return httpClient 40 } 41 42 var gc *globalConfig 43 44 func GlobalConfig() globalConfig { 45 if gc == nil { 46 gc = &globalConfig{} 47 if os.Getenv("development") == "true" { 48 gc.BaseApiUrlPath = "https://192.168.1.1:2002/api/" 49 gc.AuthUrl = "https://192.168.1.1:8010/oauth2/auth" 50 gc.TokenURL = "https://192.168.1.1:8010/oauth2/token" 51 gc.WebServerTcpAddess = "192.168.1.1:2003" 52 gc.RedirectURL = "https://192.168.1.1:11109/.approvalnativeapp" 53 } else { 54 gc.BaseApiUrlPath = "https://cloud.swish-cloud.com/api/" 55 gc.AuthUrl = "https://id.swish-cloud.com/oauth2/auth" 56 gc.TokenURL = "https://id.swish-cloud.com/oauth2/token" 57 gc.WebServerTcpAddess = "cloud.swish-cloud.com:8007" 58 gc.RedirectURL = "https://id.swish-cloud.com/.approvalnativeapp" 59 } 60 } 61 return *gc 62 } 63 func OAuth2Config() *oauth2.Config { 64 conf := oauth2.Config{} 65 conf.ClientID = "FILESYNC_MOBILE" 66 conf.Scopes = []string{"offline"} 67 conf.Endpoint = oauth2.Endpoint{ 68 AuthURL: GlobalConfig().AuthUrl, 69 TokenURL: GlobalConfig().TokenURL, 70 } 71 conf.RedirectURL = GlobalConfig().RedirectURL 72 return &conf 73 } 74 func GetLogs(start int64) ([]models.Log, error) { 75 params := url.Values{} 76 params.Add("start", strconv.FormatInt(start, 10)) 77 url := GlobalConfig().BaseApiUrlPath + "log" + "?" + params.Encode() 78 token, err := GetToken() 79 if err != nil { 80 return nil, err 81 } 82 rar := common.NewRestApiRequest("GET", url, nil).SetAuthHeader(token) 83 resp, err := rac.Do(rar) 84 if err != nil { 85 return nil, err 86 } 87 b, err := ioutil.ReadAll(resp.Body) 88 if err != nil { 89 return nil, err 90 } 91 result := struct{ Data []models.Log }{} 92 err = json.Unmarshal(b, &result) 93 if err != nil { 94 return nil, err 95 } 96 return result.Data, nil 97 } 98 99 func HttpPostFileAction(directory_actions []models.CreateDirectoryAction, file_actions []models.CreateFileAction) error { 100 directory_b, err := json.Marshal(directory_actions) 101 if err != nil { 102 return err 103 } 104 file_b, err := json.Marshal(file_actions) 105 if err != nil { 106 return err 107 } 108 params := url.Values{} 109 params.Add("directory_actions", string(directory_b)) 110 params.Add("file_actions", string(file_b)) 111 url := GlobalConfig().BaseApiUrlPath + "file" 112 token, err := GetToken() 113 if err != nil { 114 return err 115 } 116 rar := common.NewRestApiRequest("POST", url, []byte(params.Encode())).SetAuthHeader(token) 117 resp, err := rac.Do(rar) 118 if err != nil { 119 return err 120 } 121 m, err := common.ReadAsMap(resp.Body) 122 if err != nil { 123 return err 124 } 125 if m["error"] != nil { 126 return errors.New(m["error"].(string)) 127 } 128 fmt.Println("all is ok") 129 return nil 130 } 131 func GetFileData(file_name, md5, directory_path string, is_hidden bool, token *oauth2.Token) (map[string]interface{}, error) { 132 params := url.Values{} 133 params.Add("md5", md5) 134 params.Add("name", file_name) 135 params.Add("directory_path", directory_path) 136 params.Add("is_hidden", strconv.FormatBool(is_hidden)) 137 url := GlobalConfig().BaseApiUrlPath + "file" + "?" + params.Encode() 138 rar := common.NewRestApiRequest("GET", url, nil).SetAuthHeader(token) 139 resp, err := rac.Do(rar) 140 if err != nil { 141 return nil, err 142 } 143 m, err := common.ReadAsMap(resp.Body) 144 if err != nil { 145 return nil, err 146 } 147 if m["error"] != nil { 148 return nil, errors.New(m["error"].(string)) 149 } 150 return m["data"].(map[string]interface{}), nil 151 } 152 func DeleteFile(file_id string) error { 153 params := url.Values{} 154 params.Add("file_id", file_id) 155 token, err := GetToken() 156 if err != nil { 157 return err 158 } 159 url := GlobalConfig().BaseApiUrlPath + "file" + "?" + params.Encode() 160 rar := common.NewRestApiRequest("DELETE", url, nil).SetAuthHeader(token) 161 resp, err := rac.Do(rar) 162 if err != nil { 163 return err 164 } 165 m, err := common.ReadAsMap(resp.Body) 166 if err != nil { 167 return err 168 } 169 if m["error"] != nil { 170 return errors.New(m["error"].(string)) 171 } 172 return nil 173 } 174 func GetDirectory(p_id string, name string, skip_tls_verify bool) (map[string]interface{}, error) { 175 params := url.Values{} 176 params.Add("p_id", p_id) 177 params.Add("name", name) 178 token, err := GetToken() 179 if err != nil { 180 return nil, err 181 } 182 url := GlobalConfig().BaseApiUrlPath + "directory" + "?" + params.Encode() 183 rar := common.NewRestApiRequest("GET", url, nil).SetAuthHeader(token) 184 resp, err := rac.Do(rar) 185 if err != nil { 186 return nil, err 187 } 188 if err != nil { 189 return nil, err 190 } 191 m, err := common.ReadAsMap(resp.Body) 192 if err != nil { 193 return nil, err 194 } 195 if m["error"] != nil { 196 return nil, errors.New(m["error"].(string)) 197 } 198 if m["data"] == nil { 199 return nil, nil 200 } 201 return m["data"].(map[string]interface{}), nil 202 } 203 204 func FileInfo(md5 string, size int64) (map[string]interface{}, error) { 205 params := url.Values{} 206 params.Add("md5", md5) 207 params.Add("size", strconv.FormatInt(size, 10)) 208 url := GlobalConfig().BaseApiUrlPath + "file-info" + "?" + params.Encode() 209 token, err := GetToken() 210 if err != nil { 211 return nil, err 212 } 213 rar := common.NewRestApiRequest("GET", url, nil).SetAuthHeader(token) 214 resp, err := rac.Do(rar) 215 if err != nil { 216 return nil, err 217 } 218 m, err := common.ReadAsMap(resp.Body) 219 if err != nil { 220 return nil, err 221 } 222 if m["error"] != nil { 223 return nil, errors.New(m["error"].(string)) 224 } 225 if m["data"] == nil { 226 return nil, nil 227 } 228 return m["data"].(map[string]interface{}), nil 229 } 230 231 func CreateDirectory(path string, name string, is_hidden bool) error { 232 params := url.Values{} 233 params.Add("path", path) 234 params.Add("name", name) 235 params.Add("is_hidden", strconv.FormatBool(is_hidden)) 236 url := GlobalConfig().BaseApiUrlPath + "directory" 237 token, err := GetToken() 238 if err != nil { 239 return err 240 } 241 rar := common.NewRestApiRequest("POST", url, []byte(params.Encode())).SetAuthHeader(token) 242 resp, err := rac.Do(rar) 243 if err != nil { 244 return err 245 } 246 m, err := common.ReadAsMap(resp.Body) 247 if err != nil { 248 return err 249 } 250 if m["error"] != nil { 251 return errors.New(m["error"].(string)) 252 } 253 return nil 254 } 255 256 var rac *common.RestApiClient 257 258 func InitRAC(skip_tls_verify bool) error { 259 if rac != nil { 260 return errors.New("can't repeatedly call this method") 261 } 262 rac = common.NewRestApiClient(skip_tls_verify) 263 return nil 264 } 265 func RestApiClient() *common.RestApiClient { 266 return rac 267 } 268 269 func GetApiUrlPath(p string) string { 270 return GlobalConfig().BaseApiUrlPath + p 271 } 272 273 func GetToken() (*oauth2.Token, error) { 274 b, err := ioutil.ReadFile(token_save_path) 275 if err != nil { 276 return nil, err 277 } 278 token := &oauth2.Token{} 279 if err := yaml.Unmarshal(b, token); err != nil { 280 return nil, err 281 } 282 ts := OAuth2Config().TokenSource(context.WithValue(context.Background(), oauth2.HTTPClient, HttpClient()), token) 283 t, err := ts.Token() 284 if err != nil { 285 return nil, err 286 } 287 if t.AccessToken != token.AccessToken { 288 log.Println("got refreshed new token") 289 SaveToken(t) 290 return t, nil 291 } 292 return token, nil 293 } 294 295 func SaveToken(token *oauth2.Token) { 296 if b, err := yaml.Marshal(token); err != nil { 297 panic(err) 298 } else if err := ioutil.WriteFile(token_save_path, b, os.ModePerm); err != nil { 299 panic(err) 300 } 301 } 302 func CheckErr(err error) { 303 if err != nil { 304 log.Fatal(err) 305 os.Exit(1) 306 } 307 } 308 func Token_save_path(val string) { 309 token_save_path = val 310 }