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  }