mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-22 07:15:25 +00:00
Amend examples (#211)
This commit is contained in:
@@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Micro Go Client
|
|
||||||
|
|
||||||
This directory contains the Go clients for micro services
|
|
||||||
@@ -27,7 +27,6 @@ import (
|
|||||||
"github.com/micro/services/clients/go/sms"
|
"github.com/micro/services/clients/go/sms"
|
||||||
"github.com/micro/services/clients/go/stock"
|
"github.com/micro/services/clients/go/stock"
|
||||||
"github.com/micro/services/clients/go/stream"
|
"github.com/micro/services/clients/go/stream"
|
||||||
"github.com/micro/services/clients/go/sunnah"
|
|
||||||
"github.com/micro/services/clients/go/thumbnail"
|
"github.com/micro/services/clients/go/thumbnail"
|
||||||
"github.com/micro/services/clients/go/time"
|
"github.com/micro/services/clients/go/time"
|
||||||
"github.com/micro/services/clients/go/twitter"
|
"github.com/micro/services/clients/go/twitter"
|
||||||
@@ -66,7 +65,6 @@ func NewClient(token string) *Client {
|
|||||||
SmsService: sms.NewSmsService(token),
|
SmsService: sms.NewSmsService(token),
|
||||||
StockService: stock.NewStockService(token),
|
StockService: stock.NewStockService(token),
|
||||||
StreamService: stream.NewStreamService(token),
|
StreamService: stream.NewStreamService(token),
|
||||||
SunnahService: sunnah.NewSunnahService(token),
|
|
||||||
ThumbnailService: thumbnail.NewThumbnailService(token),
|
ThumbnailService: thumbnail.NewThumbnailService(token),
|
||||||
TimeService: time.NewTimeService(token),
|
TimeService: time.NewTimeService(token),
|
||||||
TwitterService: twitter.NewTwitterService(token),
|
TwitterService: twitter.NewTwitterService(token),
|
||||||
@@ -105,7 +103,6 @@ type Client struct {
|
|||||||
SmsService *sms.SmsService
|
SmsService *sms.SmsService
|
||||||
StockService *stock.StockService
|
StockService *stock.StockService
|
||||||
StreamService *stream.StreamService
|
StreamService *stream.StreamService
|
||||||
SunnahService *sunnah.SunnahService
|
|
||||||
ThumbnailService *thumbnail.ThumbnailService
|
ThumbnailService *thumbnail.ThumbnailService
|
||||||
TimeService *time.TimeService
|
TimeService *time.TimeService
|
||||||
TwitterService *twitter.TwitterService
|
TwitterService *twitter.TwitterService
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ type Result struct {
|
|||||||
// The associated arabic text
|
// The associated arabic text
|
||||||
Text string `json:"text"`
|
Text string `json:"text"`
|
||||||
// The related translations to the text
|
// The related translations to the text
|
||||||
Translations []Translation `json:"translations"`
|
Translations []Interpretation `json:"translations"`
|
||||||
// The unique verse id across the Quran
|
// The unique verse id across the Quran
|
||||||
VerseId int32 `json:"verseId"`
|
VerseId int32 `json:"verseId"`
|
||||||
// The verse key e.g 1:1
|
// The verse key e.g 1:1
|
||||||
|
|||||||
@@ -1,183 +0,0 @@
|
|||||||
package sunnah
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/m3o/m3o-go/client"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewSunnahService(token string) *SunnahService {
|
|
||||||
return &SunnahService{
|
|
||||||
client: client.NewClient(&client.Options{
|
|
||||||
Token: token,
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type SunnahService struct {
|
|
||||||
client *client.Client
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a list of books from within a collection. A book can contain many chapters
|
|
||||||
// each with its own hadiths.
|
|
||||||
func (t *SunnahService) Books(request *BooksRequest) (*BooksResponse, error) {
|
|
||||||
rsp := &BooksResponse{}
|
|
||||||
return rsp, t.client.Call("sunnah", "Books", request, rsp)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all the chapters of a given book within a collection.
|
|
||||||
func (t *SunnahService) Chapters(request *ChaptersRequest) (*ChaptersResponse, error) {
|
|
||||||
rsp := &ChaptersResponse{}
|
|
||||||
return rsp, t.client.Call("sunnah", "Chapters", request, rsp)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a list of available collections. A collection is
|
|
||||||
// a compilation of hadiths collected and written by an author.
|
|
||||||
func (t *SunnahService) Collections(request *CollectionsRequest) (*CollectionsResponse, error) {
|
|
||||||
rsp := &CollectionsResponse{}
|
|
||||||
return rsp, t.client.Call("sunnah", "Collections", request, rsp)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hadiths returns a list of hadiths and their corresponding text for a
|
|
||||||
// given book within a collection.
|
|
||||||
func (t *SunnahService) Hadiths(request *HadithsRequest) (*HadithsResponse, error) {
|
|
||||||
rsp := &HadithsResponse{}
|
|
||||||
return rsp, t.client.Call("sunnah", "Hadiths", request, rsp)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Book struct {
|
|
||||||
// arabic name of the book
|
|
||||||
ArabicName string `json:"arabicName"`
|
|
||||||
// number of hadiths in the book
|
|
||||||
Hadiths int32 `json:"hadiths"`
|
|
||||||
// number of the book e.g 1
|
|
||||||
Id int32 `json:"id"`
|
|
||||||
// name of the book
|
|
||||||
Name string `json:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type BooksRequest struct {
|
|
||||||
// Name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// Limit the number of books returned
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type BooksResponse struct {
|
|
||||||
// A list of books
|
|
||||||
Books []Book `json:"books"`
|
|
||||||
// Name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// The limit specified
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page requested
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
// The total overall books
|
|
||||||
Total int32 `json:"total"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Chapter struct {
|
|
||||||
// arabic title
|
|
||||||
ArabicTitle string `json:"arabicTitle"`
|
|
||||||
// the book number
|
|
||||||
Book int32 `json:"book"`
|
|
||||||
// the chapter id e.g 1
|
|
||||||
Id int32 `json:"id"`
|
|
||||||
// the chapter key e.g 1.00
|
|
||||||
Key string `json:"key"`
|
|
||||||
// title of the chapter
|
|
||||||
Title string `json:"title"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChaptersRequest struct {
|
|
||||||
// number of the book
|
|
||||||
Book int32 `json:"book"`
|
|
||||||
// name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// Limit the number of chapters returned
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChaptersResponse struct {
|
|
||||||
// number of the book
|
|
||||||
Book int32 `json:"book"`
|
|
||||||
// The chapters of the book
|
|
||||||
Chapters []Chapter `json:"chapters"`
|
|
||||||
// name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// Limit the number of chapters returned
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
// Total chapters in the book
|
|
||||||
Total int32 `json:"total"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Collection struct {
|
|
||||||
// Arabic title if available
|
|
||||||
ArabicTitle string `json:"arabicTitle"`
|
|
||||||
// Total hadiths in the collection
|
|
||||||
Hadiths int32 `json:"hadiths"`
|
|
||||||
// Name of the collection e.g bukhari
|
|
||||||
Name string `json:"name"`
|
|
||||||
// An introduction explaining the collection
|
|
||||||
Summary string `json:"summary"`
|
|
||||||
// Title of the collection e.g Sahih al-Bukhari
|
|
||||||
Title string `json:"title"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CollectionsRequest struct {
|
|
||||||
// Number of collections to limit to
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CollectionsResponse struct {
|
|
||||||
Collections []Collection `json:"collections"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Hadith struct {
|
|
||||||
// the arabic chapter title
|
|
||||||
ArabicChapterTitle string `json:"arabicChapterTitle"`
|
|
||||||
// the arabic text
|
|
||||||
ArabicText string `json:"arabicText"`
|
|
||||||
// the chapter id
|
|
||||||
Chapter int32 `json:"chapter"`
|
|
||||||
// the chapter key
|
|
||||||
ChapterKey string `json:"chapterKey"`
|
|
||||||
// the chapter title
|
|
||||||
ChapterTitle string `json:"chapterTitle"`
|
|
||||||
// hadith id
|
|
||||||
Id int32 `json:"id"`
|
|
||||||
// hadith text
|
|
||||||
Text string `json:"text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type HadithsRequest struct {
|
|
||||||
// number of the book
|
|
||||||
Book int32 `json:"book"`
|
|
||||||
// name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// Limit the number of hadiths
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type HadithsResponse struct {
|
|
||||||
// number of the book
|
|
||||||
Book int32 `json:"book"`
|
|
||||||
// name of the collection
|
|
||||||
Collection string `json:"collection"`
|
|
||||||
// The hadiths of the book
|
|
||||||
Hadiths []Hadith `json:"hadiths"`
|
|
||||||
// Limit the number of hadiths returned
|
|
||||||
Limit int32 `json:"limit"`
|
|
||||||
// The page in the pagination
|
|
||||||
Page int32 `json:"page"`
|
|
||||||
// Total hadiths in the book
|
|
||||||
Total int32 `json:"total"`
|
|
||||||
}
|
|
||||||
@@ -24,7 +24,6 @@ import * as sentiment from "./sentiment";
|
|||||||
import * as sms from "./sms";
|
import * as sms from "./sms";
|
||||||
import * as stock from "./stock";
|
import * as stock from "./stock";
|
||||||
import * as stream from "./stream";
|
import * as stream from "./stream";
|
||||||
import * as sunnah from "./sunnah";
|
|
||||||
import * as thumbnail from "./thumbnail";
|
import * as thumbnail from "./thumbnail";
|
||||||
import * as time from "./time";
|
import * as time from "./time";
|
||||||
import * as twitter from "./twitter";
|
import * as twitter from "./twitter";
|
||||||
@@ -60,7 +59,6 @@ export class Client {
|
|||||||
this.smsService = new sms.SmsService(token);
|
this.smsService = new sms.SmsService(token);
|
||||||
this.stockService = new stock.StockService(token);
|
this.stockService = new stock.StockService(token);
|
||||||
this.streamService = new stream.StreamService(token);
|
this.streamService = new stream.StreamService(token);
|
||||||
this.sunnahService = new sunnah.SunnahService(token);
|
|
||||||
this.thumbnailService = new thumbnail.ThumbnailService(token);
|
this.thumbnailService = new thumbnail.ThumbnailService(token);
|
||||||
this.timeService = new time.TimeService(token);
|
this.timeService = new time.TimeService(token);
|
||||||
this.twitterService = new twitter.TwitterService(token);
|
this.twitterService = new twitter.TwitterService(token);
|
||||||
@@ -95,7 +93,6 @@ export class Client {
|
|||||||
smsService: sms.SmsService;
|
smsService: sms.SmsService;
|
||||||
stockService: stock.StockService;
|
stockService: stock.StockService;
|
||||||
streamService: stream.StreamService;
|
streamService: stream.StreamService;
|
||||||
sunnahService: sunnah.SunnahService;
|
|
||||||
thumbnailService: thumbnail.ThumbnailService;
|
thumbnailService: thumbnail.ThumbnailService;
|
||||||
timeService: time.TimeService;
|
timeService: time.TimeService;
|
||||||
twitterService: twitter.TwitterService;
|
twitterService: twitter.TwitterService;
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
"./sms": "./dist/sms/index.js",
|
"./sms": "./dist/sms/index.js",
|
||||||
"./stock": "./dist/stock/index.js",
|
"./stock": "./dist/stock/index.js",
|
||||||
"./stream": "./dist/stream/index.js",
|
"./stream": "./dist/stream/index.js",
|
||||||
"./sunnah": "./dist/sunnah/index.js",
|
|
||||||
"./test": "./dist/test/index.js",
|
"./test": "./dist/test/index.js",
|
||||||
"./thumbnail": "./dist/thumbnail/index.js",
|
"./thumbnail": "./dist/thumbnail/index.js",
|
||||||
"./time": "./dist/time/index.js",
|
"./time": "./dist/time/index.js",
|
||||||
@@ -59,5 +58,5 @@
|
|||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
"version": "1.0.520"
|
"version": "1.0.521"
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ export interface Verse {
|
|||||||
// The unique id of the verse in the whole book
|
// The unique id of the verse in the whole book
|
||||||
id?: number;
|
id?: number;
|
||||||
// The interpretations of the verse
|
// The interpretations of the verse
|
||||||
interpretations?: Translation[];
|
interpretations?: Interpretation[];
|
||||||
// The key of this verse (chapter:verse) e.g 1:1
|
// The key of this verse (chapter:verse) e.g 1:1
|
||||||
key?: string;
|
key?: string;
|
||||||
// The verse number in this chapter
|
// The verse number in this chapter
|
||||||
@@ -161,7 +161,7 @@ export interface Verse {
|
|||||||
// The basic translation of the verse
|
// The basic translation of the verse
|
||||||
translatedText?: string;
|
translatedText?: string;
|
||||||
// The alternative translations for the verse
|
// The alternative translations for the verse
|
||||||
translations?: Translation[];
|
translations?: Interpretation[];
|
||||||
// The phonetic transliteration from arabic
|
// The phonetic transliteration from arabic
|
||||||
transliteration?: string;
|
transliteration?: string;
|
||||||
// The individual words within the verse (Ayah)
|
// The individual words within the verse (Ayah)
|
||||||
|
|||||||
@@ -1,183 +0,0 @@
|
|||||||
import * as m3o from "@m3o/m3o-node";
|
|
||||||
|
|
||||||
export class SunnahService {
|
|
||||||
private client: m3o.Client;
|
|
||||||
|
|
||||||
constructor(token: string) {
|
|
||||||
this.client = new m3o.Client({ token: token });
|
|
||||||
}
|
|
||||||
// Get a list of books from within a collection. A book can contain many chapters
|
|
||||||
// each with its own hadiths.
|
|
||||||
books(request: BooksRequest): Promise<BooksResponse> {
|
|
||||||
return this.client.call(
|
|
||||||
"sunnah",
|
|
||||||
"Books",
|
|
||||||
request
|
|
||||||
) as Promise<BooksResponse>;
|
|
||||||
}
|
|
||||||
// Get all the chapters of a given book within a collection.
|
|
||||||
chapters(request: ChaptersRequest): Promise<ChaptersResponse> {
|
|
||||||
return this.client.call(
|
|
||||||
"sunnah",
|
|
||||||
"Chapters",
|
|
||||||
request
|
|
||||||
) as Promise<ChaptersResponse>;
|
|
||||||
}
|
|
||||||
// Get a list of available collections. A collection is
|
|
||||||
// a compilation of hadiths collected and written by an author.
|
|
||||||
collections(request: CollectionsRequest): Promise<CollectionsResponse> {
|
|
||||||
return this.client.call(
|
|
||||||
"sunnah",
|
|
||||||
"Collections",
|
|
||||||
request
|
|
||||||
) as Promise<CollectionsResponse>;
|
|
||||||
}
|
|
||||||
// Hadiths returns a list of hadiths and their corresponding text for a
|
|
||||||
// given book within a collection.
|
|
||||||
hadiths(request: HadithsRequest): Promise<HadithsResponse> {
|
|
||||||
return this.client.call(
|
|
||||||
"sunnah",
|
|
||||||
"Hadiths",
|
|
||||||
request
|
|
||||||
) as Promise<HadithsResponse>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Book {
|
|
||||||
// arabic name of the book
|
|
||||||
arabicName?: string;
|
|
||||||
// number of hadiths in the book
|
|
||||||
hadiths?: number;
|
|
||||||
// number of the book e.g 1
|
|
||||||
id?: number;
|
|
||||||
// name of the book
|
|
||||||
name?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface BooksRequest {
|
|
||||||
// Name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// Limit the number of books returned
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface BooksResponse {
|
|
||||||
// A list of books
|
|
||||||
books?: Book[];
|
|
||||||
// Name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// The limit specified
|
|
||||||
limit?: number;
|
|
||||||
// The page requested
|
|
||||||
page?: number;
|
|
||||||
// The total overall books
|
|
||||||
total?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Chapter {
|
|
||||||
// arabic title
|
|
||||||
arabicTitle?: string;
|
|
||||||
// the book number
|
|
||||||
book?: number;
|
|
||||||
// the chapter id e.g 1
|
|
||||||
id?: number;
|
|
||||||
// the chapter key e.g 1.00
|
|
||||||
key?: string;
|
|
||||||
// title of the chapter
|
|
||||||
title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ChaptersRequest {
|
|
||||||
// number of the book
|
|
||||||
book?: number;
|
|
||||||
// name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// Limit the number of chapters returned
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ChaptersResponse {
|
|
||||||
// number of the book
|
|
||||||
book?: number;
|
|
||||||
// The chapters of the book
|
|
||||||
chapters?: Chapter[];
|
|
||||||
// name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// Limit the number of chapters returned
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
// Total chapters in the book
|
|
||||||
total?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Collection {
|
|
||||||
// Arabic title if available
|
|
||||||
arabicTitle?: string;
|
|
||||||
// Total hadiths in the collection
|
|
||||||
hadiths?: number;
|
|
||||||
// Name of the collection e.g bukhari
|
|
||||||
name?: string;
|
|
||||||
// An introduction explaining the collection
|
|
||||||
summary?: string;
|
|
||||||
// Title of the collection e.g Sahih al-Bukhari
|
|
||||||
title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CollectionsRequest {
|
|
||||||
// Number of collections to limit to
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CollectionsResponse {
|
|
||||||
collections?: Collection[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Hadith {
|
|
||||||
// the arabic chapter title
|
|
||||||
arabicChapterTitle?: string;
|
|
||||||
// the arabic text
|
|
||||||
arabicText?: string;
|
|
||||||
// the chapter id
|
|
||||||
chapter?: number;
|
|
||||||
// the chapter key
|
|
||||||
chapterKey?: string;
|
|
||||||
// the chapter title
|
|
||||||
chapterTitle?: string;
|
|
||||||
// hadith id
|
|
||||||
id?: number;
|
|
||||||
// hadith text
|
|
||||||
text?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HadithsRequest {
|
|
||||||
// number of the book
|
|
||||||
book?: number;
|
|
||||||
// name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// Limit the number of hadiths
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HadithsResponse {
|
|
||||||
// number of the book
|
|
||||||
book?: number;
|
|
||||||
// name of the collection
|
|
||||||
collection?: string;
|
|
||||||
// The hadiths of the book
|
|
||||||
hadiths?: Hadith[];
|
|
||||||
// Limit the number of hadiths returned
|
|
||||||
limit?: number;
|
|
||||||
// The page in the pagination
|
|
||||||
page?: number;
|
|
||||||
// Total hadiths in the book
|
|
||||||
total?: number;
|
|
||||||
}
|
|
||||||
@@ -264,7 +264,9 @@ func main() {
|
|||||||
fmt.Println(string(exam), err)
|
fmt.Println(string(exam), err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
if len(service.Spec.Paths) != len(m) {
|
||||||
|
fmt.Printf("Service has %v endpoints, but only %v examples\n", len(service.Spec.Paths), len(m))
|
||||||
|
}
|
||||||
for endpoint, examples := range m {
|
for endpoint, examples := range m {
|
||||||
for _, example := range examples {
|
for _, example := range examples {
|
||||||
title := regexp.MustCompile("[^a-zA-Z0-9]+").ReplaceAllString(strcase.LowerCamelCase(strings.Replace(example.Title, " ", "_", -1)), "")
|
title := regexp.MustCompile("[^a-zA-Z0-9]+").ReplaceAllString(strcase.LowerCamelCase(strings.Replace(example.Title, " ", "_", -1)), "")
|
||||||
|
|||||||
@@ -1,45 +1,76 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"price": [{
|
"news": [
|
||||||
"title": "Get cryptocurrency price",
|
{
|
||||||
"description": "Returns the last traded price of a currency",
|
"title": "Get cryptocurrency news",
|
||||||
"request": {
|
"request": {
|
||||||
"symbol": "BTCUSD"
|
"symbol": "BTCUSD"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"symbol": "BTCUSD",
|
"articles": [
|
||||||
"price": 34682.74
|
{
|
||||||
}
|
"title": "$80 Billion Brazilian Investment Bank Launches Bitcoin and Crypto Trading App",
|
||||||
}],
|
"description": "Brazilian investment bank BTG Pactual becomes first large financial institution in Brazil to enable customers to make direct investments in Bitcoin.",
|
||||||
"quote": [{
|
"url": "https://bitcoinmagazine.com/culture/80-billion-brazilian-investment-bank-launches-bitcoin-and-crypto-trading-app",
|
||||||
"title": "Get a cryptocurrency quote",
|
"date": "2021-09-21T13:13:01+00:00",
|
||||||
"description": "Returns the last quote for a currency including bid and ask prices",
|
"source": "Bitcoin Magazine"
|
||||||
"request": {
|
},
|
||||||
"symbol": "BTCUSD"
|
{
|
||||||
},
|
"title": "Bitcoin at $40,000, Ethereum at $2,800 Very Important Levels to Watch Now: Mike Novogratz",
|
||||||
"response": {
|
"description": "Head of Galaxy Digital Mike Novogratz explains what levels are important for BTC and Ether now that the Chinese real-estate monster crisis is hitting the crypto market",
|
||||||
"symbol": "BTCUSD",
|
"url": "https://u.today/bitcoin-at-40000-ethereum-at-2800-very-important-levels-to-watch-now-mike-novogratz",
|
||||||
"ask_price": 34679.87,
|
"date": "2021-09-21T12:51:00+00:00",
|
||||||
"bid_price": 34679.86,
|
"source": "UToday"
|
||||||
"ask_size": 0.595412,
|
}
|
||||||
"bid_size": 0.122235,
|
]
|
||||||
"timestamp": "2021-06-20T17:25:50.772Z"
|
}
|
||||||
}
|
}
|
||||||
}],
|
],
|
||||||
"history": [{
|
"price": [
|
||||||
"title": "Get previous close",
|
{
|
||||||
"description": "Returns the history for the previous close",
|
"title": "Get cryptocurrency price",
|
||||||
"request": {
|
"description": "Returns the last traded price of a currency",
|
||||||
"symbol": "BTCUSD"
|
"request": {
|
||||||
},
|
"symbol": "BTCUSD"
|
||||||
"response": {
|
},
|
||||||
"symbol": "btcusd",
|
"response": {
|
||||||
"open": 35483.72,
|
"symbol": "BTCUSD",
|
||||||
"close": 34470.8,
|
"price": 34682.74
|
||||||
"high": 35922,
|
}
|
||||||
"low": 33336,
|
}
|
||||||
"volume": 66202.264956,
|
],
|
||||||
"date": "2021-06-20"
|
"quote": [
|
||||||
}
|
{
|
||||||
}]
|
"title": "Get a cryptocurrency quote",
|
||||||
|
"description": "Returns the last quote for a currency including bid and ask prices",
|
||||||
|
"request": {
|
||||||
|
"symbol": "BTCUSD"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"symbol": "BTCUSD",
|
||||||
|
"ask_price": 34679.87,
|
||||||
|
"bid_price": 34679.86,
|
||||||
|
"ask_size": 0.595412,
|
||||||
|
"bid_size": 0.122235,
|
||||||
|
"timestamp": "2021-06-20T17:25:50.772Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"history": [
|
||||||
|
{
|
||||||
|
"title": "Get previous close",
|
||||||
|
"description": "Returns the history for the previous close",
|
||||||
|
"request": {
|
||||||
|
"symbol": "BTCUSD"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"symbol": "btcusd",
|
||||||
|
"open": 35483.72,
|
||||||
|
"close": 34470.8,
|
||||||
|
"high": 35922,
|
||||||
|
"low": 33336,
|
||||||
|
"volume": 66202.264956,
|
||||||
|
"date": "2021-06-20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,86 +1,159 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"codes": [{
|
"codes": [
|
||||||
"title": "Get supported codes",
|
{
|
||||||
"description": "Returns the supported currency codes (example response)",
|
"title": "Get supported codes",
|
||||||
"run_check": true,
|
"description": "Returns the supported currency codes (example response)",
|
||||||
"request": {},
|
"run_check": true,
|
||||||
"response": {
|
"request": {},
|
||||||
"codes": [
|
"response": {
|
||||||
{
|
"codes": [
|
||||||
"name": "AED",
|
{
|
||||||
"currency": "UAE Dirham"
|
"name": "AED",
|
||||||
},
|
"currency": "UAE Dirham"
|
||||||
{
|
},
|
||||||
"name": "AFN",
|
{
|
||||||
"currency": "Afghan Afghani"
|
"name": "AFN",
|
||||||
},
|
"currency": "Afghan Afghani"
|
||||||
{
|
},
|
||||||
"name": "ALL",
|
{
|
||||||
"currency": "Albanian Lek"
|
"name": "ALL",
|
||||||
},
|
"currency": "Albanian Lek"
|
||||||
{
|
},
|
||||||
"name": "AMD",
|
{
|
||||||
"currency": "Armenian Dram"
|
"name": "AMD",
|
||||||
},
|
"currency": "Armenian Dram"
|
||||||
{
|
},
|
||||||
"name": "ANG",
|
{
|
||||||
"currency": "Netherlands Antillian Guilder"
|
"name": "ANG",
|
||||||
}
|
"currency": "Netherlands Antillian Guilder"
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rates": [
|
||||||
|
{
|
||||||
|
"title": "Get rates for USD",
|
||||||
|
"description": "Returns the rates for USD (sample response)",
|
||||||
|
"run_check": true,
|
||||||
|
"request": {
|
||||||
|
"code": "USD"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"code": "usd",
|
||||||
|
"rates": {
|
||||||
|
"AED": 3.6725,
|
||||||
|
"AFN": 79.0514,
|
||||||
|
"ALL": 101.6054,
|
||||||
|
"AMD": 515.68,
|
||||||
|
"ANG": 1.79,
|
||||||
|
"AOA": 646.8737,
|
||||||
|
"ARS": 95.3433,
|
||||||
|
"AUD": 1.2998,
|
||||||
|
"AWG": 1.79,
|
||||||
|
"AZN": 1.7013
|
||||||
}
|
}
|
||||||
}],
|
}
|
||||||
"rates": [{
|
}
|
||||||
"title": "Get rates for USD",
|
],
|
||||||
"description": "Returns the rates for USD (sample response)",
|
"convert": [
|
||||||
"run_check": true,
|
{
|
||||||
"request": {
|
"title": "Convert USD to GBP",
|
||||||
"code": "USD"
|
"description": "Convert from USD to GBP",
|
||||||
},
|
"run_check": true,
|
||||||
"response": {
|
"request": {
|
||||||
"code": "usd",
|
"from": "USD",
|
||||||
"rates": {
|
"to": "GBP"
|
||||||
"AED": 3.6725,
|
},
|
||||||
"AFN": 79.0514,
|
"response": {
|
||||||
"ALL": 101.6054,
|
"from": "USD",
|
||||||
"AMD": 515.68,
|
"to": "GBP",
|
||||||
"ANG": 1.79,
|
"rate": 0.7104
|
||||||
"AOA": 646.8737,
|
}
|
||||||
"ARS": 95.3433,
|
},
|
||||||
"AUD": 1.2998,
|
{
|
||||||
"AWG": 1.79,
|
"title": "Convert $10 USD to GBP",
|
||||||
"AZN": 1.7013
|
"description": "Convert $10 from USD to GBP",
|
||||||
}
|
"run_check": true,
|
||||||
|
"request": {
|
||||||
|
"from": "USD",
|
||||||
|
"to": "GBP",
|
||||||
|
"amount": 10.0
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"from": "USD",
|
||||||
|
"to": "GBP",
|
||||||
|
"rate": 0.7104,
|
||||||
|
"amount": 7.104
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"history": [
|
||||||
|
{
|
||||||
|
"title": "Historic rates for a currency",
|
||||||
|
"description": "Date is in format YYYY-MM-DD",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"code": "USD",
|
||||||
|
"date": "2021-05-30"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"code": "USD",
|
||||||
|
"date": "2020-05-30",
|
||||||
|
"rates": {
|
||||||
|
"AED": 3.672,
|
||||||
|
"ARS": 68.3238,
|
||||||
|
"AUD": 1.5017,
|
||||||
|
"BGN": 1.7573,
|
||||||
|
"BRL": 5.372,
|
||||||
|
"BSD": 1,
|
||||||
|
"CAD": 1.3758,
|
||||||
|
"CHF": 0.9625,
|
||||||
|
"CLP": 810.6932,
|
||||||
|
"CNY": 7.1408,
|
||||||
|
"COP": 3711.2273,
|
||||||
|
"CZK": 24.2592,
|
||||||
|
"DKK": 6.7076,
|
||||||
|
"DOP": 55.3539,
|
||||||
|
"EGP": 15.8108,
|
||||||
|
"EUR": 0.9004,
|
||||||
|
"FJD": 2.2202,
|
||||||
|
"GBP": 0.8108,
|
||||||
|
"GTQ": 7.6924,
|
||||||
|
"HKD": 7.753,
|
||||||
|
"HRK": 6.8175,
|
||||||
|
"HUF": 313.7167,
|
||||||
|
"IDR": 14536.6684,
|
||||||
|
"ILS": 3.5082,
|
||||||
|
"INR": 75.5508,
|
||||||
|
"ISK": 135.7104,
|
||||||
|
"JPY": 107.4223,
|
||||||
|
"KRW": 1236.3642,
|
||||||
|
"KZT": 412.3586,
|
||||||
|
"MXN": 22.1514,
|
||||||
|
"MYR": 4.3465,
|
||||||
|
"NOK": 9.7236,
|
||||||
|
"NZD": 1.61,
|
||||||
|
"PAB": 1,
|
||||||
|
"PEN": 3.4361,
|
||||||
|
"PHP": 50.5076,
|
||||||
|
"PKR": 160.0922,
|
||||||
|
"PLN": 4.0015,
|
||||||
|
"PYG": 6803.9167,
|
||||||
|
"RON": 4.361,
|
||||||
|
"RUB": 70.561,
|
||||||
|
"SAR": 3.7548,
|
||||||
|
"SEK": 9.4421,
|
||||||
|
"SGD": 1.4125,
|
||||||
|
"THB": 31.8255,
|
||||||
|
"TRY": 6.8228,
|
||||||
|
"TWD": 30.0096,
|
||||||
|
"UAH": 26.8391,
|
||||||
|
"USD": 1,
|
||||||
|
"UYU": 43.0401,
|
||||||
|
"ZAR": 17.5029
|
||||||
}
|
}
|
||||||
}],
|
}
|
||||||
"convert": [{
|
}
|
||||||
"title": "Convert USD to GBP",
|
]
|
||||||
"description": "Convert from USD to GBP",
|
|
||||||
"run_check": true,
|
|
||||||
"request": {
|
|
||||||
"from": "USD",
|
|
||||||
"to": "GBP"
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"from": "USD",
|
|
||||||
"to": "GBP",
|
|
||||||
"rate": 0.7104
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Convert $10 USD to GBP",
|
|
||||||
"description": "Convert $10 from USD to GBP",
|
|
||||||
"run_check": true,
|
|
||||||
"request": {
|
|
||||||
"from": "USD",
|
|
||||||
"to": "GBP",
|
|
||||||
"amount": 10.0
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"from": "USD",
|
|
||||||
"to": "GBP",
|
|
||||||
"rate": 0.7104,
|
|
||||||
"amount": 7.104
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
curl "https://api.m3o.com/v1/sunnah/Books" \
|
curl "https://api.m3o.com/v1/crypto/News" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
-d '{
|
-d '{
|
||||||
"collection": "bukhari"
|
"symbol": "BTCUSD"
|
||||||
}'
|
}'
|
||||||
16
examples/crypto/news/go/getCryptocurrencyNews.go
Executable file
16
examples/crypto/news/go/getCryptocurrencyNews.go
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/crypto"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get news related to a currency
|
||||||
|
func GetCryptocurrencyNews() {
|
||||||
|
cryptoService := crypto.NewCryptoService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := cryptoService.News(&crypto.NewsRequest{
|
||||||
|
Symbol: "BTCUSD",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
12
examples/crypto/news/node/getCryptocurrencyNews.js
Executable file
12
examples/crypto/news/node/getCryptocurrencyNews.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as crypto from "m3o/crypto";
|
||||||
|
|
||||||
|
// Get news related to a currency
|
||||||
|
async function GetCryptocurrencyNews() {
|
||||||
|
let cryptoService = new crypto.CryptoService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await cryptoService.news({
|
||||||
|
symbol: "BTCUSD",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await GetCryptocurrencyNews();
|
||||||
7
examples/currency/history/curl/historicRatesForACurrency.sh
Executable file
7
examples/currency/history/curl/historicRatesForACurrency.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
curl "https://api.m3o.com/v1/currency/History" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"code": "USD",
|
||||||
|
"date": "2021-05-30"
|
||||||
|
}'
|
||||||
17
examples/currency/history/go/historicRatesForACurrency.go
Executable file
17
examples/currency/history/go/historicRatesForACurrency.go
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/currency"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Returns the historic rates for a currency on a given date
|
||||||
|
func HistoricRatesForAcurrency() {
|
||||||
|
currencyService := currency.NewCurrencyService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := currencyService.History(¤cy.HistoryRequest{
|
||||||
|
Code: "USD",
|
||||||
|
Date: "2021-05-30",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
15
examples/currency/history/node/historicRatesForACurrency.js
Executable file
15
examples/currency/history/node/historicRatesForACurrency.js
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
import * as currency from "m3o/currency";
|
||||||
|
|
||||||
|
// Returns the historic rates for a currency on a given date
|
||||||
|
async function HistoricRatesForAcurrency() {
|
||||||
|
let currencyService = new currency.CurrencyService(
|
||||||
|
process.env.MICRO_API_TOKEN
|
||||||
|
);
|
||||||
|
let rsp = await currencyService.history({
|
||||||
|
code: "USD",
|
||||||
|
date: "2021-05-30",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await HistoricRatesForAcurrency();
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
curl "https://api.m3o.com/v1/sunnah/Hadiths" \
|
curl "https://api.m3o.com/v1/helloworld/Stream" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
-d '{
|
-d '{
|
||||||
"book": 1,
|
"name": "not supported"
|
||||||
"collection": "bukhari"
|
|
||||||
}'
|
}'
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/helloworld"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Stream returns a stream of "Hello $name" responses
|
||||||
|
func StreamsAreCurrentlyTemporarilyNotSupportedInClients() {
|
||||||
|
helloworldService := helloworld.NewHelloworldService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := helloworldService.Stream(&helloworld.StreamRequest{
|
||||||
|
Name: "not supported",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import * as helloworld from "m3o/helloworld";
|
||||||
|
|
||||||
|
// Stream returns a stream of "Hello $name" responses
|
||||||
|
async function StreamsAreCurrentlyTemporarilyNotSupportedInClients() {
|
||||||
|
let helloworldService = new helloworld.HelloworldService(
|
||||||
|
process.env.MICRO_API_TOKEN
|
||||||
|
);
|
||||||
|
let rsp = await helloworldService.stream({
|
||||||
|
name: "not supported",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await StreamsAreCurrentlyTemporarilyNotSupportedInClients();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
curl "https://api.m3o.com/v1/sunnah/Collections" \
|
curl "https://api.m3o.com/v1/id/Types" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
-d '{}'
|
-d '{}'
|
||||||
14
examples/id/types/go/listTheTypesOfIdsAvailable.go
Executable file
14
examples/id/types/go/listTheTypesOfIdsAvailable.go
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/id"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// List the types of IDs available. No query params needed.
|
||||||
|
func ListTheTypesOfIdsAvailable() {
|
||||||
|
idService := id.NewIdService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := idService.Types(&id.TypesRequest{})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
10
examples/id/types/node/listTheTypesOfIdsAvailable.js
Executable file
10
examples/id/types/node/listTheTypesOfIdsAvailable.js
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
import * as id from "m3o/id";
|
||||||
|
|
||||||
|
// List the types of IDs available. No query params needed.
|
||||||
|
async function ListTheTypesOfIdsAvailable() {
|
||||||
|
let idService = new id.IdService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await idService.types({});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await ListTheTypesOfIdsAvailable();
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package example
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/micro/services/clients/go/sunnah"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get a list of books from within a collection. A book can contain many chapters
|
|
||||||
// each with its own hadiths.
|
|
||||||
func GetTheBooksWithinAcollection() {
|
|
||||||
sunnahService := sunnah.NewSunnahService(os.Getenv("MICRO_API_TOKEN"))
|
|
||||||
rsp, err := sunnahService.Books(&sunnah.BooksRequest{
|
|
||||||
Collection: "bukhari",
|
|
||||||
})
|
|
||||||
fmt.Println(rsp, err)
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import * as sunnah from "m3o/sunnah";
|
|
||||||
|
|
||||||
// Get a list of books from within a collection. A book can contain many chapters
|
|
||||||
// each with its own hadiths.
|
|
||||||
async function GetTheBooksWithinAcollection() {
|
|
||||||
let sunnahService = new sunnah.SunnahService(process.env.MICRO_API_TOKEN);
|
|
||||||
let rsp = await sunnahService.books({
|
|
||||||
collection: "bukhari",
|
|
||||||
});
|
|
||||||
console.log(rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
await GetTheBooksWithinAcollection();
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package example
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/micro/services/clients/go/sunnah"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get all the chapters of a given book within a collection.
|
|
||||||
func ListTheChaptersInAbook() {
|
|
||||||
sunnahService := sunnah.NewSunnahService(os.Getenv("MICRO_API_TOKEN"))
|
|
||||||
rsp, err := sunnahService.Chapters(&sunnah.ChaptersRequest{
|
|
||||||
Book: 1,
|
|
||||||
Collection: "bukhari",
|
|
||||||
})
|
|
||||||
fmt.Println(rsp, err)
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import * as sunnah from "m3o/sunnah";
|
|
||||||
|
|
||||||
// Get all the chapters of a given book within a collection.
|
|
||||||
async function ListTheChaptersInAbook() {
|
|
||||||
let sunnahService = new sunnah.SunnahService(process.env.MICRO_API_TOKEN);
|
|
||||||
let rsp = await sunnahService.chapters({
|
|
||||||
book: 1,
|
|
||||||
collection: "bukhari",
|
|
||||||
});
|
|
||||||
console.log(rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
await ListTheChaptersInAbook();
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package example
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/micro/services/clients/go/sunnah"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get a list of available collections. A collection is
|
|
||||||
// a compilation of hadiths collected and written by an author.
|
|
||||||
func ListAvailableCollections() {
|
|
||||||
sunnahService := sunnah.NewSunnahService(os.Getenv("MICRO_API_TOKEN"))
|
|
||||||
rsp, err := sunnahService.Collections(&sunnah.CollectionsRequest{})
|
|
||||||
fmt.Println(rsp, err)
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import * as sunnah from "m3o/sunnah";
|
|
||||||
|
|
||||||
// Get a list of available collections. A collection is
|
|
||||||
// a compilation of hadiths collected and written by an author.
|
|
||||||
async function ListAvailableCollections() {
|
|
||||||
let sunnahService = new sunnah.SunnahService(process.env.MICRO_API_TOKEN);
|
|
||||||
let rsp = await sunnahService.collections({});
|
|
||||||
console.log(rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
await ListAvailableCollections();
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package example
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/micro/services/clients/go/sunnah"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Hadiths returns a list of hadiths and their corresponding text for a
|
|
||||||
// given book within a collection.
|
|
||||||
func ListTheHadithsInAbook() {
|
|
||||||
sunnahService := sunnah.NewSunnahService(os.Getenv("MICRO_API_TOKEN"))
|
|
||||||
rsp, err := sunnahService.Hadiths(&sunnah.HadithsRequest{
|
|
||||||
Book: 1,
|
|
||||||
Collection: "bukhari",
|
|
||||||
})
|
|
||||||
fmt.Println(rsp, err)
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import * as sunnah from "m3o/sunnah";
|
|
||||||
|
|
||||||
// Hadiths returns a list of hadiths and their corresponding text for a
|
|
||||||
// given book within a collection.
|
|
||||||
async function ListTheHadithsInAbook() {
|
|
||||||
let sunnahService = new sunnah.SunnahService(process.env.MICRO_API_TOKEN);
|
|
||||||
let rsp = await sunnahService.hadiths({
|
|
||||||
book: 1,
|
|
||||||
collection: "bukhari",
|
|
||||||
});
|
|
||||||
console.log(rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
await ListTheHadithsInAbook();
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
curl "https://api.m3o.com/v1/sunnah/Chapters" \
|
curl "https://api.m3o.com/v1/twitter/Search" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
-d '{
|
-d '{
|
||||||
"book": 1,
|
"query": "cats"
|
||||||
"collection": "bukhari"
|
|
||||||
}'
|
}'
|
||||||
16
examples/twitter/search/go/searchForTweets.go
Executable file
16
examples/twitter/search/go/searchForTweets.go
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/twitter"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Search for tweets with a simple query
|
||||||
|
func SearchForTweets() {
|
||||||
|
twitterService := twitter.NewTwitterService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := twitterService.Search(&twitter.SearchRequest{
|
||||||
|
Query: "cats",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
12
examples/twitter/search/node/searchForTweets.js
Executable file
12
examples/twitter/search/node/searchForTweets.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as twitter from "m3o/twitter";
|
||||||
|
|
||||||
|
// Search for tweets with a simple query
|
||||||
|
async function SearchForTweets() {
|
||||||
|
let twitterService = new twitter.TwitterService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await twitterService.search({
|
||||||
|
query: "cats",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await SearchForTweets();
|
||||||
4
examples/twitter/trends/curl/getTheCurrentGlobalTrendingTopics.sh
Executable file
4
examples/twitter/trends/curl/getTheCurrentGlobalTrendingTopics.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
curl "https://api.m3o.com/v1/twitter/Trends" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{}'
|
||||||
14
examples/twitter/trends/go/getTheCurrentGlobalTrendingTopics.go
Executable file
14
examples/twitter/trends/go/getTheCurrentGlobalTrendingTopics.go
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/twitter"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get the current global trending topics
|
||||||
|
func GetTheCurrentGlobalTrendingTopics() {
|
||||||
|
twitterService := twitter.NewTwitterService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := twitterService.Trends(&twitter.TrendsRequest{})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
10
examples/twitter/trends/node/getTheCurrentGlobalTrendingTopics.js
Executable file
10
examples/twitter/trends/node/getTheCurrentGlobalTrendingTopics.js
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
import * as twitter from "m3o/twitter";
|
||||||
|
|
||||||
|
// Get the current global trending topics
|
||||||
|
async function GetTheCurrentGlobalTrendingTopics() {
|
||||||
|
let twitterService = new twitter.TwitterService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await twitterService.trends({});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await GetTheCurrentGlobalTrendingTopics();
|
||||||
6
examples/twitter/user/curl/getAUsersTwitterProfile.sh
Executable file
6
examples/twitter/user/curl/getAUsersTwitterProfile.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
curl "https://api.m3o.com/v1/twitter/User" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"username": "crufter"
|
||||||
|
}'
|
||||||
16
examples/twitter/user/go/getAUsersTwitterProfile.go
Executable file
16
examples/twitter/user/go/getAUsersTwitterProfile.go
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/twitter"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get a user's twitter profile
|
||||||
|
func GetAusersTwitterProfile() {
|
||||||
|
twitterService := twitter.NewTwitterService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := twitterService.User(&twitter.UserRequest{
|
||||||
|
Username: "crufter",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
12
examples/twitter/user/node/getAUsersTwitterProfile.js
Executable file
12
examples/twitter/user/node/getAUsersTwitterProfile.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as twitter from "m3o/twitter";
|
||||||
|
|
||||||
|
// Get a user's twitter profile
|
||||||
|
async function GetAusersTwitterProfile() {
|
||||||
|
let twitterService = new twitter.TwitterService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await twitterService.user({
|
||||||
|
username: "crufter",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await GetAusersTwitterProfile();
|
||||||
6
examples/user/readSession/curl/readASessionByTheSessionId.sh
Executable file
6
examples/user/readSession/curl/readASessionByTheSessionId.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
curl "https://api.m3o.com/v1/user/ReadSession" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"sessionId": "sds34s34s34-s34s34-s43s43s34-s4s34s"
|
||||||
|
}'
|
||||||
16
examples/user/readSession/go/readASessionByTheSessionId.go
Executable file
16
examples/user/readSession/go/readASessionByTheSessionId.go
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/user"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Read a session by the session id. In the event it has expired or is not found and error is returned.
|
||||||
|
func ReadAsessionByTheSessionId() {
|
||||||
|
userService := user.NewUserService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := userService.ReadSession(&user.ReadSessionRequest{
|
||||||
|
SessionId: "sds34s34s34-s34s34-s43s43s34-s4s34s",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
12
examples/user/readSession/node/readASessionByTheSessionId.js
Executable file
12
examples/user/readSession/node/readASessionByTheSessionId.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as user from "m3o/user";
|
||||||
|
|
||||||
|
// Read a session by the session id. In the event it has expired or is not found and error is returned.
|
||||||
|
async function ReadAsessionByTheSessionId() {
|
||||||
|
let userService = new user.UserService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await userService.readSession({
|
||||||
|
sessionId: "sds34s34s34-s34s34-s43s43s34-s4s34s",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await ReadAsessionByTheSessionId();
|
||||||
7
examples/user/update/curl/updateAnAccount.sh
Executable file
7
examples/user/update/curl/updateAnAccount.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
curl "https://api.m3o.com/v1/user/Update" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"email": "joeotheremail@example.com",
|
||||||
|
"id": "usrid-1"
|
||||||
|
}'
|
||||||
17
examples/user/update/go/updateAnAccount.go
Executable file
17
examples/user/update/go/updateAnAccount.go
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/user"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Update the account username or email
|
||||||
|
func UpdateAnAccount() {
|
||||||
|
userService := user.NewUserService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := userService.Update(&user.UpdateRequest{
|
||||||
|
Email: "joeotheremail@example.com",
|
||||||
|
Id: "usrid-1",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
13
examples/user/update/node/updateAnAccount.js
Executable file
13
examples/user/update/node/updateAnAccount.js
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
import * as user from "m3o/user";
|
||||||
|
|
||||||
|
// Update the account username or email
|
||||||
|
async function UpdateAnAccount() {
|
||||||
|
let userService = new user.UserService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await userService.update({
|
||||||
|
email: "joeotheremail@example.com",
|
||||||
|
id: "usrid-1",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await UpdateAnAccount();
|
||||||
9
examples/user/updatePassword/curl/updateTheAccountPassword.sh
Executable file
9
examples/user/updatePassword/curl/updateTheAccountPassword.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
curl "https://api.m3o.com/v1/user/UpdatePassword" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"confirmPassword": "myEvenMoreSecretPass123",
|
||||||
|
"id": "usrid-1",
|
||||||
|
"newPassword": "myEvenMoreSecretPass123",
|
||||||
|
"oldPassword": "mySecretPass123"
|
||||||
|
}'
|
||||||
18
examples/user/updatePassword/go/updateTheAccountPassword.go
Executable file
18
examples/user/updatePassword/go/updateTheAccountPassword.go
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/user"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Update the account password
|
||||||
|
func UpdateTheAccountPassword() {
|
||||||
|
userService := user.NewUserService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := userService.UpdatePassword(&user.UpdatePasswordRequest{
|
||||||
|
ConfirmPassword: "myEvenMoreSecretPass123",
|
||||||
|
NewPassword: "myEvenMoreSecretPass123",
|
||||||
|
OldPassword: "mySecretPass123",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
15
examples/user/updatePassword/node/updateTheAccountPassword.js
Executable file
15
examples/user/updatePassword/node/updateTheAccountPassword.js
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
import * as user from "m3o/user";
|
||||||
|
|
||||||
|
// Update the account password
|
||||||
|
async function UpdateTheAccountPassword() {
|
||||||
|
let userService = new user.UserService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await userService.updatePassword({
|
||||||
|
confirmPassword: "myEvenMoreSecretPass123",
|
||||||
|
id: "usrid-1",
|
||||||
|
newPassword: "myEvenMoreSecretPass123",
|
||||||
|
oldPassword: "mySecretPass123",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await UpdateTheAccountPassword();
|
||||||
6
examples/user/verifyEmail/curl/verifyEmail.sh
Executable file
6
examples/user/verifyEmail/curl/verifyEmail.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
curl "https://api.m3o.com/v1/user/VerifyEmail" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"token": "t2323t232t"
|
||||||
|
}'
|
||||||
16
examples/user/verifyEmail/go/verifyEmail.go
Executable file
16
examples/user/verifyEmail/go/verifyEmail.go
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/user"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Verify the email address of an account from a token sent in an email to the user.
|
||||||
|
func VerifyEmail() {
|
||||||
|
userService := user.NewUserService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := userService.VerifyEmail(&user.VerifyEmailRequest{
|
||||||
|
Token: "t2323t232t",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
12
examples/user/verifyEmail/node/verifyEmail.js
Executable file
12
examples/user/verifyEmail/node/verifyEmail.js
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as user from "m3o/user";
|
||||||
|
|
||||||
|
// Verify the email address of an account from a token sent in an email to the user.
|
||||||
|
async function VerifyEmail() {
|
||||||
|
let userService = new user.UserService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await userService.verifyEmail({
|
||||||
|
token: "t2323t232t",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await VerifyEmail();
|
||||||
7
examples/weather/forecast/curl/forecaseWeather.sh
Executable file
7
examples/weather/forecast/curl/forecaseWeather.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
curl "https://api.m3o.com/v1/weather/Forecast" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $MICRO_API_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"days": 2,
|
||||||
|
"location": "London"
|
||||||
|
}'
|
||||||
17
examples/weather/forecast/go/forecaseWeather.go
Executable file
17
examples/weather/forecast/go/forecaseWeather.go
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/micro/services/clients/go/weather"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get the weather forecast for the next 1-10 days
|
||||||
|
func ForecaseWeather() {
|
||||||
|
weatherService := weather.NewWeatherService(os.Getenv("MICRO_API_TOKEN"))
|
||||||
|
rsp, err := weatherService.Forecast(&weather.ForecastRequest{
|
||||||
|
Days: 2,
|
||||||
|
Location: "London",
|
||||||
|
})
|
||||||
|
fmt.Println(rsp, err)
|
||||||
|
}
|
||||||
13
examples/weather/forecast/node/forecaseWeather.js
Executable file
13
examples/weather/forecast/node/forecaseWeather.js
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
import * as weather from "m3o/weather";
|
||||||
|
|
||||||
|
// Get the weather forecast for the next 1-10 days
|
||||||
|
async function ForecaseWeather() {
|
||||||
|
let weatherService = new weather.WeatherService(process.env.MICRO_API_TOKEN);
|
||||||
|
let rsp = await weatherService.forecast({
|
||||||
|
days: 2,
|
||||||
|
location: "London",
|
||||||
|
});
|
||||||
|
console.log(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
await ForecaseWeather();
|
||||||
@@ -10,5 +10,15 @@
|
|||||||
"response": {
|
"response": {
|
||||||
"message": "Hello John"
|
"message": "Hello John"
|
||||||
}
|
}
|
||||||
|
}],
|
||||||
|
"stream": [{
|
||||||
|
"title": "Streams are currently temporarily not supported in clients",
|
||||||
|
"run_check": true,
|
||||||
|
"request": {
|
||||||
|
"name": "not supported"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"message": "not supported"
|
||||||
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,58 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
"generate": [{
|
"generate": [
|
||||||
"title": "Generate a unique ID",
|
{
|
||||||
"run_check": true,
|
"title": "Generate a unique ID",
|
||||||
"request": {
|
"run_check": true,
|
||||||
"type": "uuid"
|
"request": {
|
||||||
},
|
"type": "uuid"
|
||||||
"response": {
|
},
|
||||||
"type": "uuid",
|
"response": {
|
||||||
"id": "e9c427d8-cef1-48bd-ab89-59a6df29673b"
|
"type": "uuid",
|
||||||
}
|
"id": "e9c427d8-cef1-48bd-ab89-59a6df29673b"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Generate a short ID",
|
"title": "Generate a short ID",
|
||||||
"run_check": true,
|
"run_check": true,
|
||||||
"request": {
|
"request": {
|
||||||
"type": "shortid"
|
"type": "shortid"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"type": "shortid",
|
"type": "shortid",
|
||||||
"id": "Yivg2UeGg"
|
"id": "Yivg2UeGg"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Generate a snowflake ID",
|
"title": "Generate a snowflake ID",
|
||||||
"run_check": true,
|
"run_check": true,
|
||||||
"request": {
|
"request": {
|
||||||
"type": "snowflake"
|
"type": "snowflake"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"type": "snowflake",
|
"type": "snowflake",
|
||||||
"id": "1248956308049350656"
|
"id": "1248956308049350656"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Generate a bigflake ID",
|
"title": "Generate a bigflake ID",
|
||||||
"run_check": true,
|
"run_check": true,
|
||||||
"request": {
|
"request": {
|
||||||
"type": "bigflake"
|
"type": "bigflake"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"type": "bigflake",
|
"type": "bigflake",
|
||||||
"id": "29941839868462377496067580952577"
|
"id": "29941839868462377496067580952577"
|
||||||
}
|
}
|
||||||
}]
|
}
|
||||||
|
],
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"title": "List the types of IDs available",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {},
|
||||||
|
"response": {
|
||||||
|
"types": ["uuid", "shortid", "snowflake", "bigflake"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,105 @@
|
|||||||
{
|
{
|
||||||
"timeline": [{
|
"timeline": [
|
||||||
"title": "Get a twitter timeline",
|
{
|
||||||
"run_check": false,
|
"title": "Get a twitter timeline",
|
||||||
"request": {
|
"run_check": false,
|
||||||
"username": "m3oservices",
|
"request": {
|
||||||
"limit": 1
|
"username": "m3oservices",
|
||||||
},
|
"limit": 1
|
||||||
"response": {
|
},
|
||||||
"tweets": [{
|
"response": {
|
||||||
|
"tweets": [
|
||||||
|
{
|
||||||
"id": "1437415171966873611",
|
"id": "1437415171966873611",
|
||||||
"text": "Leveraging Micro APIs through Nocode (using @bubble) https://t.co/I5Z6bx31c7 #bubble #nocode #microapis #publicapis #m3o",
|
"text": "Leveraging Micro APIs through Nocode (using @bubble) https://t.co/I5Z6bx31c7 #bubble #nocode #microapis #publicapis #m3o",
|
||||||
"username": "m3oservices",
|
"username": "m3oservices",
|
||||||
"created_at": "Mon Sep 13 13:57:37 +0000 2021",
|
"created_at": "Mon Sep 13 13:57:37 +0000 2021",
|
||||||
"retweeted_count": "2",
|
"retweeted_count": "2",
|
||||||
"favourited_count": "2"
|
"favourited_count": "2"
|
||||||
}]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"search": [
|
||||||
|
{
|
||||||
|
"title": "Search for tweets",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"query": "cats"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"tweets": [
|
||||||
|
{
|
||||||
|
"id": "1440333358018424841",
|
||||||
|
"text": "RT @_Bomfha: In the world, I have cats on rainy days. 🌧️💧 https://t.co/C3n1NRRvhX",
|
||||||
|
"username": "syrupai",
|
||||||
|
"created_at": "Tue Sep 21 15:13:27 +0000 2021",
|
||||||
|
"retweeted_count": "114",
|
||||||
|
"favourited_count": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1440333343636090882",
|
||||||
|
"text": "RT @jbdefsyg: Bam said it’s been a long time since he’s not been alone for Chuseok considering his family is in Thailand. Seulgi asked what…",
|
||||||
|
"username": "Blackbeau5",
|
||||||
|
"created_at": "Tue Sep 21 15:13:23 +0000 2021",
|
||||||
|
"retweeted_count": "656",
|
||||||
|
"favourited_count": "0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"trends": [
|
||||||
|
{
|
||||||
|
"title": "Get the current global trending topics",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {},
|
||||||
|
"response": {
|
||||||
|
"trends": [
|
||||||
|
{
|
||||||
|
"name": "#ios15",
|
||||||
|
"url": "http://twitter.com/search?q=%23ios15",
|
||||||
|
"tweet_volume": "255802"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "#4toinformeedomex",
|
||||||
|
"url": "http://twitter.com/search?q=%234toinformeedomex",
|
||||||
|
"tweet_volume": "231617"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"user": [
|
||||||
|
{
|
||||||
|
"title": "Get a user's twitter profile",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"username": "crufter"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status": {
|
||||||
|
"id": "1093875272926023681",
|
||||||
|
"text": "@O2 It's already sorted, thanks! At least your customer support is awesome. ;)",
|
||||||
|
"username": "crufter",
|
||||||
|
"created_at": "Fri Feb 08 14:12:42 +0000 2019",
|
||||||
|
"retweeted_count": "0",
|
||||||
|
"favourited_count": "0"
|
||||||
|
},
|
||||||
|
"profile": {
|
||||||
|
"id": "2788401541",
|
||||||
|
"name": "Janos Dobronszki",
|
||||||
|
"username": "crufter",
|
||||||
|
"description": "FOLLOWS YOU. Quietly hacking away and waiting for the AI surveillance apocalypse. Always high on sencha.",
|
||||||
|
"created_at": "Wed Sep 03 18:00:02 +0000 2014",
|
||||||
|
"location": "",
|
||||||
|
"followers": "168",
|
||||||
|
"private": false,
|
||||||
|
"verified": false,
|
||||||
|
"image_url": "http://pbs.twimg.com/profile_images/664040247211069440/IzdeZPPK_normal.jpg"
|
||||||
}
|
}
|
||||||
}]
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,30 @@
|
|||||||
"response": {}
|
"response": {}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"update": [
|
||||||
|
{
|
||||||
|
"title": "Update an account",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"id": "usrid-1",
|
||||||
|
"email": "joeotheremail@example.com"
|
||||||
|
},
|
||||||
|
"response": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updatePassword": [
|
||||||
|
{
|
||||||
|
"title": "Update the account password",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"id": "usrid-1",
|
||||||
|
"oldPassword": "mySecretPass123",
|
||||||
|
"newPassword": "myEvenMoreSecretPass123",
|
||||||
|
"confirmPassword": "myEvenMoreSecretPass123"
|
||||||
|
},
|
||||||
|
"response": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
"read": [
|
"read": [
|
||||||
{
|
{
|
||||||
"title": "Read an account by id",
|
"title": "Read an account by id",
|
||||||
@@ -77,6 +101,16 @@
|
|||||||
"response": {}
|
"response": {}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"verifyEmail": [
|
||||||
|
{
|
||||||
|
"title": "Verify email",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"token": "t2323t232t"
|
||||||
|
},
|
||||||
|
"response": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
"delete": [
|
"delete": [
|
||||||
{
|
{
|
||||||
"title": "Delete user account",
|
"title": "Delete user account",
|
||||||
@@ -114,5 +148,22 @@
|
|||||||
},
|
},
|
||||||
"response": {}
|
"response": {}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"readSession": [
|
||||||
|
{
|
||||||
|
"title": "Read a session by the session id.",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"sessionId": "sds34s34s34-s34s34-s43s43s34-s4s34s"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"session": {
|
||||||
|
"id": "sds34s34s34-s34s34-s43s43s34-s4s34s",
|
||||||
|
"created": "1623677579",
|
||||||
|
"expires": "1623699579",
|
||||||
|
"userId": "fdf34f34f34-f34f34-f43f43f34-f4f34f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,74 @@
|
|||||||
{
|
{
|
||||||
"now": [{
|
"now": [
|
||||||
"title": "Get current weather",
|
{
|
||||||
"description": "Get the weather forecast right at this moment",
|
"title": "Get current weather",
|
||||||
"run_check": true,
|
"description": "Get the weather forecast right at this moment",
|
||||||
"request": {
|
"run_check": true,
|
||||||
"location": "london"
|
"request": {
|
||||||
},
|
"location": "london"
|
||||||
"response": {
|
},
|
||||||
"location": "London",
|
"response": {
|
||||||
"region": "City of London, Greater London",
|
"location": "London",
|
||||||
"country": "City of London, Greater London",
|
"region": "City of London, Greater London",
|
||||||
"latitude": 51.52,
|
"country": "City of London, Greater London",
|
||||||
"longitude": -0.11,
|
"latitude": 51.52,
|
||||||
"timezone": "Europe/London",
|
"longitude": -0.11,
|
||||||
"local_time": "2021-06-23 11:18",
|
"timezone": "Europe/London",
|
||||||
"temp_c": 16,
|
"local_time": "2021-06-23 11:18",
|
||||||
"temp_f": 60.8,
|
"temp_c": 16,
|
||||||
"feels_like_c": 16,
|
"temp_f": 60.8,
|
||||||
"feels_like_f": 60.8,
|
"feels_like_c": 16,
|
||||||
"humidity": 48,
|
"feels_like_f": 60.8,
|
||||||
"cloud": 75,
|
"humidity": 48,
|
||||||
"daytime": true,
|
"cloud": 75,
|
||||||
|
"daytime": true,
|
||||||
|
"condition": "Partly cloudy",
|
||||||
|
"icon_url": "//cdn.weatherapi.com/weather/64x64/day/116.png",
|
||||||
|
"wind_mph": 4.3,
|
||||||
|
"wind_kph": 6.8,
|
||||||
|
"wind_direction": "NE",
|
||||||
|
"wind_degree": 40
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"forecast": [
|
||||||
|
{
|
||||||
|
"title": "Forecase weather",
|
||||||
|
"run_check": false,
|
||||||
|
"request": {
|
||||||
|
"days": 2,
|
||||||
|
"location": "London"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"forecast": [
|
||||||
|
{
|
||||||
|
"date": "2021-09-21",
|
||||||
|
"max_temp_c": 21.8,
|
||||||
|
"max_temp_f": 71.2,
|
||||||
|
"min_temp_c": 13,
|
||||||
|
"min_temp_f": 55.4,
|
||||||
|
"avg_temp_c": 17.3,
|
||||||
|
"avg_temp_f": 63.1,
|
||||||
"condition": "Partly cloudy",
|
"condition": "Partly cloudy",
|
||||||
"icon_url": "//cdn.weatherapi.com/weather/64x64/day/116.png",
|
"icon_url": "//cdn.weatherapi.com/weather/64x64/day/116.png",
|
||||||
"wind_mph": 4.3,
|
"sunrise": "06:45 AM",
|
||||||
"wind_kph": 6.8,
|
"sunset": "07:01 PM"
|
||||||
"wind_direction": "NE",
|
},
|
||||||
"wind_degree": 40
|
{
|
||||||
}
|
"date": "2021-09-22",
|
||||||
}]
|
"max_temp_c": 24.1,
|
||||||
|
"max_temp_f": 75.4,
|
||||||
|
"min_temp_c": 13.4,
|
||||||
|
"min_temp_f": 56.1,
|
||||||
|
"avg_temp_c": 18.1,
|
||||||
|
"avg_temp_f": 64.6,
|
||||||
|
"condition": "Partly cloudy",
|
||||||
|
"icon_url": "//cdn.weatherapi.com/weather/64x64/day/116.png",
|
||||||
|
"sunrise": "06:47 AM",
|
||||||
|
"sunset": "06:58 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user