iFun Engine API  1.0.0-b6053
Great Technology for Great Games
deploy_api_service.h
Go to the documentation of this file.
1 // Copyright (C) 2013-2020 iFunFactory Inc. All Rights Reserved.
2 //
3 // This work is confidential and proprietary to iFunFactory Inc. and
4 // must not be used, disclosed, copied, or distributed without the prior
5 // consent of iFunFactory Inc.
6 
9 #ifndef INCLUDE_FUNAPI_MANAGEMENT_DEPLOY_API_SERVICE_H_
10 #define INCLUDE_FUNAPI_MANAGEMENT_DEPLOY_API_SERVICE_H_
11 
12 
13 #include <boost/function.hpp>
14 #include <boost/noncopyable.hpp>
15 #include <boost/regex.hpp>
16 #include <boost/shared_ptr.hpp>
17 #include <boost/variant.hpp>
18 
20 #include <funapi/time/wall_clock.h>
21 #include <funapi/types.h>
22 
23 #include <string>
24 #include <vector>
25 
26 namespace fun {
27 
28 class Json;
29 
30 // HTTP response writers
31 struct FUNAPI_DLL_VISIBILITY ResponseWriter : private boost::noncopyable {
32  virtual ~ResponseWriter();
33 };
34 
35 
36 struct FUNAPI_DLL_VISIBILITY VoidResponseWriter : public ResponseWriter {
37  // Writes HTTP response with given status code
38  virtual void Write(const fun::http::StatusCode code) = 0;
39 };
40 
41 
42 template<typename T>
44  // Writes HTTP status code and result of type `T' to HTTP response
45  virtual void Write(const fun::http::StatusCode code, T *result) = 0;
46 };
47 
48 
53 
54 
55 class FUNAPI_DLL_VISIBILITY DeployApiService : public boost::noncopyable {
56  // Interface class for iFunDeploy APIs
57  // 아이펀 디플로이를 위한 인터페이스 클래스
58  // https://docs.ifun-deploy.com/
59  public:
60  enum MissionPeriod {
61  kMissionPeriodDaily = 0,
62  kMissionPeriodWeekly = 1,
63  kMissionPeriodMonthly = 2,
64  };
65 
66  enum MissionType {
67  kMissionTypeNormal = 0,
68  kMissionTypeAchievement = 1,
69  };
70 
71  struct FUNAPI_DLL_VISIBILITY PageInfo {
72  // NOTE: {0, 0} means that paging is disabled.
73  uint32_t page_no; // page number; starts from 1
74  uint32_t page_size; // number of entries for a single page
75 
76  PageInfo();
77  };
78 
79  struct FUNAPI_DLL_VISIBILITY DeployApiHandlerBase
80  : private boost::noncopyable {
81  struct BanUserErrorInfo;
82  struct UnbanUserErrorInfo;
83  struct NoticeMessage;
84 
89 
90  virtual ~DeployApiHandlerBase();
91 
92  // Should return searchable condition list for accounts
93  virtual void GetUserSearchConditions(
94  const Ptr<StringVectorResponseWriter> &writer) const;
95 
96  // Searches account for a given condition
97  virtual void SearchUsers(
98  const std::string &condition_name,
99  const std::string &condition_value,
100  const PageInfo &page_info,
101  const Ptr<JsonVectorResponseWriter> &writer) const;
102 
103  // Returns user data as JSON for user identified by "id".
104  // In case of failure, should pass appropritate HTTP status code.
105  virtual void GetUser(
106  const std::string &id,
107  const Ptr<JsonResponseWriter> &writer) const;
108 
109  // PUT /v1/cs-api/account/<id>/<field>/<value>
110  virtual void UpdateUser(
111  const std::string &id,
112  const std::string &field,
113  const std::string &value,
114  const Ptr<VoidResponseWriter> &writer) const;
115 
116  // Returns connection status for the account as string
117  virtual void IsLoggedIn(
118  const std::string &key,
119  const Ptr<BoolResponseWriter> &writer) const;
120 
121  // Forces user to be logged-out
122  virtual void ForceLogout(
123  const std::string &id,
124  const Ptr<VoidResponseWriter> &writer) const;
125 
126  // User ban
127  // {
128  struct FUNAPI_DLL_VISIBILITY BanUserErrorInfo {
129  std::string id;
130  std::string description;
131  };
132 
133  struct FUNAPI_DLL_VISIBILITY UnbanUserErrorInfo {
134  std::string id;
135  std::string description;
136  };
137 
138  virtual void GetUserBanned(
139  const std::string &key,
140  const Ptr<BoolResponseWriter> &writer) const;
141 
142  DEPRECATED(virtual void BanUser(
143  const std::string &key, const Ptr<VoidResponseWriter> &writer) const);
144 
145  virtual void BanUsers(
146  const std::vector<std::string> &user_ids,
147  const Ptr<BanUsersResponseWriter> &writer) const;
148 
149  DEPRECATED(virtual void UnbanUser(
150  const std::string &key, const Ptr<VoidResponseWriter> &writer) const);
151 
152  virtual void UnbanUsers(
153  const std::vector<std::string> &user_ids,
154  const Ptr<UnbanUsersResponseWriter> &writer) const;
155  // }
156 
157  // Characters API
158  // {
159  virtual void GetCharacters(
160  const std::string &user_id,
161  const Ptr<JsonVectorResponseWriter> &writer) const;
162 
163  virtual void GetCharacter(
164  const std::string &character_id,
165  const Ptr<JsonResponseWriter> &writer) const;
166 
167  virtual void UpdateCharacter(
168  const std::string &character_id,
169  const std::string &field,
170  const std::string &value,
171  const Ptr<VoidResponseWriter> &writer) const;
172 
173  // vector of (inventory type, vector of inventory id)
174  typedef std::vector<std::pair<std::string, std::vector<std::string> > >
175  InventoryInfo;
176  virtual void GetCharacterInventoryInfo(
177  const std::string &character_id,
178  const Ptr<ResponseWriterT<InventoryInfo> > &writer) const;
179 
180  // result should be JSON array, which holds item data
181  virtual void GetInventory(
182  const std::string &type,
183  const std::string &inventory_id,
184  const PageInfo &page_info,
185  const Ptr<JsonVectorResponseWriter> &writer) const;
186 
187  // iFunDeploy expects there are `expected_item_quantity` items for item_id.
188  // In this function, one should decrease the quantity of item
189  // by `quantity_to_reclaim`.
190  virtual void DeleteInventoryItem(
191  const std::string &inventory_type,
192  const std::string &inventory_id,
193  const std::string &item_id,
194  const int64_t expected_item_quantity,
195  const int64_t quantity_to_reclaim,
196  const Ptr<VoidResponseWriter> &writer) const;
197 
198  struct FUNAPI_DLL_VISIBILITY ReclaimInfo {
199  struct FUNAPI_DLL_VISIBILITY ReclaimedItem {
200  std::string item_id;
201  int64_t expected_item_quantity; // expected quantity of the item
202  int64_t quantity_to_reclaim; // # of items to be decreased
203  };
204 
205  std::string inventory_type;
206  std::string inventory_id;
207  std::vector<ReclaimedItem> reclaimed;
208  };
209 
210  virtual void DeleteMultipleInventoryItems(
211  const std::vector<ReclaimInfo> &reclaimed,
212  const Ptr<VoidResponseWriter> &writer) const;
213 
214  // send gift to specific users
215  virtual void GiveGift(
216  const std::string &target_type, // target type; (account or character)
217  const std::string &title, // title of the gift message
218  const std::string &content, // body of the gift message
219  const fun::WallClock::Value &expires, // expiration time for the gift
220  const std::vector<std::pair<std::string, uint64_t> > &items,
221  const std::vector<std::string> &users, // recipients
222  const Ptr<VoidResponseWriter> &writer) const;
223 
224  // send gift to all the users
225  virtual void GiveGiftToAll(
226  const std::string &target_type, // target type; (account or character)
227  const std::string &title, // title of the gift message
228  const std::string &content, // body of the gift message
229  const fun::WallClock::Value &expires, // expiration time for the gift
230  const std::vector<std::pair<std::string, uint64_t> > &items,
231  const Ptr<VoidResponseWriter> &writer) const;
232  // }
233 
234  // 2019-04
235  // refund the payment.
236  // See https://docs.ifun-deploy.com/api.html#api-basic-payment
237  virtual void Refund(
238  const std::string &receipt_id,
239  const fun::Json &purchase_log,
240  const Ptr<VoidResponseWriter> &writer) const;
241 
242  // realtime notice
243  struct FUNAPI_DLL_VISIBILITY NoticeMessage {
244  std::string language_code;
245  std::string message;
246  };
247  virtual void SendRealtimeNotice(
248  const std::string &category,
249  const std::string &color,
250  const std::vector<NoticeMessage> &messages,
251  const Ptr<VoidResponseWriter> &writer) const;
252 
253  // {
254  // mission API
255  virtual void GetCharacterPeriodicMissionStatus(
256  const std::string &character_id,
257  MissionPeriod period,
258  const fun::WallClock::Value &start_date,
259  const PageInfo &page_info,
260  const Ptr<JsonVectorResponseWriter> &writer) const;
261 
262  // category, search condition/keyword는 빈 값일 수 있으며 이 경우는
263  // 해당 값으로 필터링 하지 말아야 한다.
264  //
265  // category, search_condition and/or search_keyword can be empty.
266  // In that case, you shall not filter mission list by that criterion.
267  virtual void GetCharacterMissionStatus(
268  const std::string &character_id,
269  MissionType mission_type, // normal or achievement
270  const std::string &category, // can be empty
271  const std::string &search_condition, // can be empty
272  const std::string &search_keryword, // can be empty
273  bool is_completed, // completed && rewarded
274  const PageInfo &page_info,
275  const Ptr<JsonVectorResponseWriter> &writer) const;
276  // }
277  protected:
278  DeployApiHandlerBase(); // Never instantiate DeployApiHandlerBase
279  };
280 
281  // Restrict editable fields for user, character
282  static bool SetEditableFieldsForUser(
283  const std::vector<std::string> &field_list);
284  static bool SetEditableFieldsForCharacter(
285  const std::vector<std::string> &field_list);
286 
287  // Restrict items which could be sent to user as a gift.
288  // item_list should be vector of (item-id, item-name) pairs.
289  static bool SetGiftableItems(
290  const std::vector<std::pair<std::string, std::string> > &item_list);
291 
292  // Specify additional realtime notice categories.
293  // NOTE: By default, "chat" and "screen" are included.
294  static bool SetRealtimeNoticeCategory(
295  const std::vector<std::string> &category);
296 
297  // Mission
298  static bool SetMissionCategory(
299  const std::vector<std::string> &normal_mission_category,
300  const std::vector<std::string> &achievement_mission_category);
301 
302  // Event API
303  // {
304  struct FUNAPI_DLL_VISIBILITY CampaignRewardSchema {
305  enum ValueType {
306  //int, float, string
307  VT_INT = 0, // int64_t
308  VT_FLOAT = 1, // double
309  VT_STRING = 2, // std::string
310  };
311 
312  std::string id; // identifier to distinguish rewards in single campaign
313  std::string name; // display name; can be empty string.
314  ValueType value_type;
315  };
316 
317  struct FUNAPI_DLL_VISIBILITY Campaign {
318  std::string name;
319  std::vector<CampaignRewardSchema> reward_schemas;
320  };
321 
322  // Arguments passed from iFun Deploy to campaign.
323  // 아이펀 디플로이에서 캠페인 콜백에게 전달하는 인자.
324  struct FUNAPI_DLL_VISIBILITY CampaignArgument {
325  std::string name;
326  std::string description;
327 
328  // Arguments will be parsed as specified in CampaignRewardSchema.
329  // 각 인자는 CampaignRewardSchema 에 지정한 타입으로 파싱합니다.
330  // VT_INT: int64_t
331  // VT_DOUBLE: double
332  // VT_STRING: string
333  typedef boost::variant<int64_t, double, std::string> Value;
334 
335  // list of named pairs. (reward)
336  // 보상에 해당하는 이름, 값 쌍 목록.
337  std::vector<std::pair<std::string, Value> > values;
338 
339  fun::WallClock::Value begin_ts;
340  fun::WallClock::Value end_ts;
341 
342  bool is_recurring; // is recurring event (or not). 반복 이벤트인지 여부.
343 
344  // For recurring campaign (반복 이벤트)
345  struct FUNAPI_DLL_VISIBILITY RecurringSchedule {
346  // day of week for the campaign (0 = Sun, 1 = Mon, ...)
347  // 이벤트에 해당하는 요일 (0 = 일, 1 = 월, ...)
348  std::vector<boost::date_time::weekdays> days_of_the_week;
349 
350  int32_t begin_ts_of_day; // 0 .. 86400 (in timezone)
351  int32_t end_ts_of_day; // 0 .. 86400 (in timezone)
352 
353  std::string timezone; // timezone in tz database (eg. Asia/Seoul)
354  } recurring_schedule;
355  };
356 
357  typedef boost::function<bool (const Campaign & /*data*/,
358  const std::string & /*type*/, const std::string & /*id*/,
359  const CampaignArgument & /*arg*/)> BeginCampaignCallback;
360 
361  typedef boost::function<bool (const Campaign & /*campaign_type*/,
362  const std::string & /*type*/, const std::string & /*id*/)>
363  EndCampaignCallback;
364 
365  typedef boost::function<bool (const Campaign &campaign_type,
366  const std::string &type, const std::string &id)>
367  CancelCampaignCallback;
368 
369  static bool RegisterCampaignType(const std::string &campaign_id,
370  const Campaign &campaign);
371  // called when the campaign begins
372  static void RegisterBeginCampaignCallback(const BeginCampaignCallback &cb);
373 
374  // called when the campaign ends
375  static void RegisterEndCampaignCallback(const EndCampaignCallback &cb);
376 
377  // called when the campaign is canceled
378  static void RegisterCancelCampaignCallback(const CancelCampaignCallback &cb);
379  // }
380 
381  // You should pass handler as subclass of DeployApiHandlerBase.
382  // If you pass DeployApiHandlerBase as handler, it will terminate execution.
383  template <typename T>
384  static void RegisterDeployApiHandler(boost::shared_ptr<T> handler);
385 
387  struct FUNAPI_DLL_VISIBILITY ExtraData : boost::noncopyable {
388  static Ptr<ExtraData> Create();
389  virtual ~ExtraData();
390 
391  // Export as JSON, which can be passed as `extra_data` argument
392  // for RegisterCustomQueryHandler.
393  virtual fun::Json Export() const = 0;
394 
395  // Create dropdown list for parameter `name`.
396  // It would make iFunDeploy UI to use select box.
397  virtual bool SetDropdownList(
398  const std::string &name, const std::vector<std::string> &values) = 0;
399 
400  protected:
401  ExtraData();
402  };
403 
406  // Takes second JSON object as argument (which should be passed in HTTP
407  // request body), then write response to writer function.
408  // Handler may write non-200 status code to indicate the error.
409  // (If the json body is not set, iFuEngine will set the JSON body as
410  // {"error": "error string for http status code"}.)
411  // The first argument is used to indicate paging.
412  typedef boost::function<void (
413  const PageInfo & /*page_info*/,
414  const fun::Json & /*request*/,
415  Ptr<JsonResponseWriter> & /*response writer*/)> CustomApiHandler;
416 
417  // Register a handler for iFunDeploy custom query
418  static void RegisterCustomQueryHandler(
419  const std::string &name, // display name
420  const http::Method &method, // HTTP verb
421  const std::string &uri, // URI (MUST NOT include regex)
422  // JSON attributes which should be provided by JSON request body
423  const std::vector<std::string> &request_fields,
424  // JSON attributes which should be placed in JSON response
425  // (for successful response)
426  const std::vector<std::string> &response_fields,
427  const CustomApiHandler &handler,
428  // Optional data which can be used by iFunDeploy to provide
429  // addtional UI component or functionality.
430  const Ptr<ExtraData> &extra_data);
431 
432  static void RegisterCustomQueryHandler(
433  const std::string &name, // display name
434  const http::Method &method, // HTTP verb
435  const std::string &uri, // URI (MUST NOT include regex)
436  // JSON attributes which should be provided by JSON request body
437  const std::vector<std::string> &request_fields,
438  // JSON attributes which should be placed in JSON response
439  // (for successful response)
440  const std::vector<std::string> &response_fields,
441  const CustomApiHandler &handler,
442  // Optional data which can be used by iFunDeploy to provide
443  // addtional UI component or functionality.
444  // You may use alternative RegisterCustomQueryHandler
445  // with ExtraData API.
446  const fun::Json &extra_data=fun::Json());
448 
449  private:
450  static void _AddImplementedHandler(const std::string &account_handler_name);
451  static void _DoRegister(boost::shared_ptr<DeployApiHandlerBase> handler);
452 };
453 
454 
457 
460 
461 
464 namespace detail {
465 
466 #define HAS_MEMBER_FUNCTION(NAME, ARGS) \
467 template <typename T> \
468 class Has ## NAME { \
469 private: \
470  typedef char Yes; \
471  typedef Yes No[2]; \
472 \
473  template <typename U, U> struct Same; \
474  template <typename C> static Yes& Test(Same< \
475  void (C::*)ARGS const, &C:: NAME>*); \
476  template <typename> static No& Test(...); \
477 \
478 public: \
479  static bool const value = sizeof(Test<T>(0)) == sizeof(Yes); \
480 }
481 
482 
483 #define CHECK_MEMBER_FUNCTION(NAME) \
484  if (detail::Has ## NAME<T>::value) { _AddImplementedHandler(#NAME); }
485 
486 
487 HAS_MEMBER_FUNCTION(GetUserSearchConditions,
488  (const Ptr<StringVectorResponseWriter>&));
489 HAS_MEMBER_FUNCTION(SearchUsers,
490  (const std::string&, const std::string&, const DeployApiService::PageInfo&,
491  const Ptr<JsonVectorResponseWriter>&));
492 HAS_MEMBER_FUNCTION(GetUser,
493  (const std::string&, const Ptr<JsonResponseWriter>&));
494 HAS_MEMBER_FUNCTION(UpdateUser,
495  (const std::string&, const std::string&, const std::string&,
496  const Ptr<VoidResponseWriter>&));
497 HAS_MEMBER_FUNCTION(IsLoggedIn,
498  (const std::string&, const Ptr<BoolResponseWriter>&));
499 HAS_MEMBER_FUNCTION(ForceLogout,
500  (const std::string&, const Ptr<VoidResponseWriter>&));
501 
502 HAS_MEMBER_FUNCTION(GetUserBanned,
503  (const std::string&, const Ptr<BoolResponseWriter>&));
504 HAS_MEMBER_FUNCTION(BanUser,
505  (const std::string&, const Ptr<VoidResponseWriter>&));
506 HAS_MEMBER_FUNCTION(BanUsers,
507  (const std::vector<std::string>&,
508  const Ptr<BanUsersResponseWriter>&));
509 HAS_MEMBER_FUNCTION(UnbanUser,
510  (const std::string&, const Ptr<VoidResponseWriter>&));
511 HAS_MEMBER_FUNCTION(UnbanUsers,
512  (const std::vector<std::string>&,
513  const Ptr<UnbanUsersResponseWriter>&));
514 
515 HAS_MEMBER_FUNCTION(GetCharacters,
516  (const std::string &, const Ptr<JsonVectorResponseWriter>&));
517 HAS_MEMBER_FUNCTION(GetCharacter,
518  (const std::string &, const Ptr<JsonResponseWriter>&));
519 HAS_MEMBER_FUNCTION(UpdateCharacter,
520  (const std::string&, const std::string&, const std::string&,
521  const Ptr<VoidResponseWriter> &));
522 HAS_MEMBER_FUNCTION(GiveGift,
523  (const std::string&, const std::string&, const std::string&,
524  const fun::WallClock::Value&,
525  const std::vector<std::pair<std::string, uint64_t> >&,
526  const std::vector<std::string>&,
527  const Ptr<VoidResponseWriter> &));
528 HAS_MEMBER_FUNCTION(GiveGiftToAll,
529  (const std::string&, const std::string&,
530  const fun::WallClock::Value&,
531  const std::vector<std::pair<std::string, uint64_t> >&,
532  const Ptr<VoidResponseWriter> &));
533 HAS_MEMBER_FUNCTION(GetCharacterInventoryInfo,
534  (const std::string &,
535  const Ptr<ResponseWriterT<
536  DeployApiService::DeployApiHandlerBase::InventoryInfo> >&));
537 HAS_MEMBER_FUNCTION(GetInventory,
538  (const std::string&, const std::string &,
540  const Ptr<JsonVectorResponseWriter>&));
541 HAS_MEMBER_FUNCTION(DeleteInventoryItem,
542  (const std::string&, const std::string&, const std::string &,
543  const int64_t, const int64_t, const Ptr<VoidResponseWriter> &));
544 HAS_MEMBER_FUNCTION(DeleteMultipleInventoryItems,
545  (const std::vector<DeployApiService::DeployApiHandlerBase::ReclaimInfo> &,
546  const Ptr<VoidResponseWriter> &));
547 HAS_MEMBER_FUNCTION(Refund,
548  (const std::string &, const fun::Json &, const Ptr<VoidResponseWriter> &));
549 HAS_MEMBER_FUNCTION(SendRealtimeNotice,
550  (const std::string &,
551  const std::string &,
552  const std::vector<DeployApiService::DeployApiHandlerBase::NoticeMessage>&,
553  const Ptr<VoidResponseWriter> &));
554 HAS_MEMBER_FUNCTION(GetCharacterPeriodicMissionStatus,
555  (const std::string &, DeployApiService::MissionPeriod,
556  const fun::WallClock::Value &, const DeployApiService::PageInfo &,
557  const Ptr<JsonVectorResponseWriter> &));
558 HAS_MEMBER_FUNCTION(GetCharacterMissionStatus,
559  (const std::string &, DeployApiService::MissionType, const std::string &,
560  const std::string &, const std::string &, bool,
562  const Ptr<JsonVectorResponseWriter> &));
564 
565 } // namespace detail
566 
567 // NOTE: You MUST NOT call this specialized function.
568 template <>
569 void DeployApiService::RegisterDeployApiHandler<
571  boost::shared_ptr<DeployApiService::DeployApiHandlerBase> handler);
572 
573 
574 template <typename T>
575 void DeployApiService::RegisterDeployApiHandler(boost::shared_ptr<T> handler) {
576  CHECK_MEMBER_FUNCTION(GetUserSearchConditions);
577  CHECK_MEMBER_FUNCTION(SearchUsers);
578 
579  CHECK_MEMBER_FUNCTION(GetUser);
580  CHECK_MEMBER_FUNCTION(UpdateUser);
581  CHECK_MEMBER_FUNCTION(IsLoggedIn);
582  CHECK_MEMBER_FUNCTION(ForceLogout);
583 
584  CHECK_MEMBER_FUNCTION(GetUserBanned);
585  CHECK_MEMBER_FUNCTION(BanUser);
586  CHECK_MEMBER_FUNCTION(BanUsers);
587  CHECK_MEMBER_FUNCTION(UnbanUser);
588  CHECK_MEMBER_FUNCTION(UnbanUsers);
589 
590  CHECK_MEMBER_FUNCTION(GetCharacters);
591  CHECK_MEMBER_FUNCTION(GetCharacter);
592  CHECK_MEMBER_FUNCTION(UpdateCharacter);
593  CHECK_MEMBER_FUNCTION(GiveGift);
594  if (not detail::HasGiveGift<T>::value) {
595  CHECK_MEMBER_FUNCTION(GiveGiftToAll);
596  }
597  CHECK_MEMBER_FUNCTION(GetCharacterInventoryInfo);
598  CHECK_MEMBER_FUNCTION(GetInventory);
599  CHECK_MEMBER_FUNCTION(DeleteInventoryItem);
600  CHECK_MEMBER_FUNCTION(DeleteMultipleInventoryItems);
601 
602  CHECK_MEMBER_FUNCTION(Refund);
603  CHECK_MEMBER_FUNCTION(SendRealtimeNotice);
604 
605  CHECK_MEMBER_FUNCTION(GetCharacterPeriodicMissionStatus);
606  CHECK_MEMBER_FUNCTION(GetCharacterMissionStatus);
607 
608  _DoRegister(static_cast<boost::shared_ptr<DeployApiHandlerBase> >(handler));
609 }
610 
611 } // namespace fun
612 
613 #endif // INCLUDE_FUNAPI_MANAGEMENT_DEPLOY_API_SERVICE_H_
StatusCode
Enum representing HTTP status code.
Definition: http_util.h:63
Definition: deploy_api_service.h:43
Definition: deploy_api_service.h:55
Definition: deploy_api_service.h:317
Definition: json.h:18
boost::function< void(const PageInfo &, const fun::Json &, Ptr< JsonResponseWriter > &)> CustomApiHandler
Custom query handlers for iFunDeploy {.
Definition: deploy_api_service.h:415
Definition: deploy_api_service.h:79
Definition: deploy_api_service.h:304
Definition: json.h:27
Definition: deploy_api_service.h:324
Definition: deploy_api_service.h:71
Defines extra data for custom query.
Definition: deploy_api_service.h:387
Definition: deploy_api_service.h:31
Definition: deploy_api_service.h:36
Method
Enum type representing HTTP methods.
Definition: http_util.h:34