summaryrefslogtreecommitdiff
path: root/plugins/CloudFile/src/Services/yandex_api.h
blob: 19c76d61f923e0b593cd1a406fe2947501a14996 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef _YANDEXSERVICE_API_H_
#define _YANDEXSERVICE_API_H_

namespace YandexAPI
{
#define YANDEX_OAUTH "https://oauth.yandex.ru"
#define YADISK_API_VER "/v1"
#define YADISK_API "https://cloud-api.yandex.net" YADISK_API_VER "/disk/resources"

#define YANDEX_APP_ID "c311a5967cae4efa88d1af97d01ea0e8"
#include "../../../miranda-private-keys/Yandex/client_secret.h"

#define YANDEX_AUTH YANDEX_OAUTH "/authorize?response_type=code&client_id=" YANDEX_APP_ID

	class GetAccessTokenRequest : public HttpRequest
	{
	public:
		GetAccessTokenRequest(const char *code) :
			HttpRequest(REQUEST_POST, YANDEX_OAUTH "/token")
		{
			AddHeader("Content-Type", "application/x-www-form-urlencoded");

			CMStringA data(CMStringDataFormat::FORMAT,
				"client_id=%s&client_secret=%s&grant_type=authorization_code&code=%s",
				YANDEX_APP_ID, YADISK_CLIENT_SECRET, code);
			SetData(data.GetBuffer(), data.GetLength());
		}
	};

	class RefreshTokenRequest : public HttpRequest
	{
	public:
		RefreshTokenRequest(const char *refreshToken) :
			HttpRequest(REQUEST_POST, YANDEX_OAUTH "/token")
		{
			AddHeader("Content-Type", "application/x-www-form-urlencoded");

			CMStringA data(CMStringDataFormat::FORMAT,
				"client_id=%s&client_secret=%s&grant_type=refresh_token&refresh_token=%s",
				YANDEX_APP_ID, YADISK_CLIENT_SECRET, refreshToken);
			SetData(data.GetBuffer(), data.GetLength());
		}
	};

	class RevokeAccessTokenRequest : public HttpRequest
	{
	public:
		RevokeAccessTokenRequest(const char *token) :
			HttpRequest(REQUEST_POST, YANDEX_OAUTH "/token/revoke")
		{
			AddOAuthHeader(token);
		}
	};

	class GetUploadUrlRequest : public HttpRequest
	{
	public:
		GetUploadUrlRequest(const char *token, const char *path, OnConflict strategy = NONE) :
			HttpRequest(REQUEST_GET, YADISK_API "/upload")
		{
			AddOAuthHeader(token);
			AddUrlParameter("path=app:%s", ptrA(mir_urlEncode(path)));
			if (strategy == OnConflict::REPLACE)
				AddUrlParameter("overwrite=true");
		}
	};

	class UploadFileRequest : public HttpRequest
	{
	public:
		UploadFileRequest(const char *url, const char *data, size_t size) :
			HttpRequest(REQUEST_PUT, url)
		{
			SetData(data, size);
		}
	};

	class UploadFileChunkRequest : public HttpRequest
	{
	public:
		UploadFileChunkRequest(const char *url, const char *chunk, size_t chunkSize, uint64_t offset, uint64_t fileSize) :
			HttpRequest(REQUEST_PUT, url)
		{
			uint64_t rangeMin = offset;
			uint64_t rangeMax = offset + chunkSize - 1;
			CMStringA range(CMStringDataFormat::FORMAT, "bytes %I64u-%I64u/%I64u", rangeMin, rangeMax, fileSize);
			AddHeader("Content-Range", range);

			SetData(chunk, chunkSize);
		}
	};

	class CreateFolderRequest : public HttpRequest
	{
	public:
		CreateFolderRequest(const char *token, const char *path) :
			HttpRequest(REQUEST_PUT, YADISK_API)
		{
			AddOAuthHeader(token);
			AddUrlParameter("path=app:%s", ptrA(mir_urlEncode(path)));
		}
	};

	class PublishRequest : public HttpRequest
	{
	public:
		PublishRequest(const char *token, const char *path) :
			HttpRequest(REQUEST_PUT, YADISK_API "/publish")
		{
			AddOAuthHeader(token);
			AddUrlParameter("path=app:%s", ptrA(mir_urlEncode(path)));
		}
	};

	class GetResourcesRequest : public HttpRequest
	{
	public:
		GetResourcesRequest(const char *token, const char *path) :
			HttpRequest(REQUEST_GET, YADISK_API)
		{
			AddOAuthHeader(token);
			AddUrlParameter("path=app:%s", ptrA(mir_urlEncode(path)));
		}
	};
};

#endif //_YANDEXSERVICE_API_H_