エンジニア・プログラマにしか使えないSNSを作ってみた話

# はじめに
通常のSNSで胡散臭い人が多いと感じてしまいました
プログラミングスクールが流行り、エンジニアになって億稼いでます！みたいな・・・

そこで、本当のエンジニア・プログラマしか使えないSNSを作ってみました！
つまり、WebApi提供のみのSNSです
一般ピープルが使うようなフロントエンドなんてありません！！
Postmanなり、なんなりを使って叩いてください

エンジニア・プログラマしかWebApiが叩けないであろうという考えなので、
エンジニア・プログラマにしか使えないSNS！ということです

この記事を見ている、プログラマ・エンジニアの方であれば使えますよね？😁

実際、WebApiが叩くことが出来れば誰でも使えてしまうわけですが・・・。

`2021/07/20 更新`
このWebApiを作ったシステムについて書きました
ソースコード公開しました
[CRUDのWebApi開発は不要！Json登録でWebApiを作れるシステムを作った話](https://qiita.com/HawkClaws/items/6f5a6938318fb7d7983d)

`2021/07/19 更新`
結構使っていただけているようで嬉しい限りです
皆さん独自のクライアントなどを作って使われているようです
（curlで叩いてる人もいるっぽいです。CUIで使えるSNSというのは確かになあぁと思いました）
一部紹介させていただきます

`2021/08/24 更新`
無料枠550時間/月　の関係で現在サービスが停止しています・・・
来月の1日には復活します・・・。

匿名さん
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/4cfae27e-3d97-e8ac-7a13-43682f8a7a2f.png">

にゃんこ仙人さん
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/7d0473e8-899d-b174-26fd-66667e860c2a.png">

15さん
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/7fb9a5d6-ff26-0438-1e5f-ca4d1249d237.png">

# 目次

####エンドポイント
`https://versatileapi.herokuapp.com/api`


####ユーザー登録（しなくてもOK）
登録
`POST　/user/create_user`

更新
`PUT 　/user/create_user
`
スキーマ

```user.json
{
    "additionalProperties":false,
    "type": "object",
    "properties": {
        "name": {
            "description": "ユーザー名",
            "type": "string",
            "maxLength": 30
        },
        "description": {
            "description": "自己紹介文",
            "type": "string",
            "maxLength": 300
        }
    },
    "required": [
        "name",
        "description"
    ]
}
```

####ユーザー検索
単一
`GET　/user/:user_id`

全部
`GET　/user/all`


####つぶやく
つぶやく
`POST　/text`

Headers
`Authorization: HelloWorld`

スキーマ

```user.json
{
    "additionalProperties":false,
    "type": "object",
    "properties": {
        "text": {
            "description": "投稿する文章",
            "type": "string",
            "minLength": 1,
            "maxLength": 280
        },
        "in_reply_to_user_id": {
            "description": "返信対象のUserId",
            "type": "string",
            "minLength": 40,
            "maxLength": 40
        },            
        "in_reply_to_text_id": {
            "description": "返信対象のTextId",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "text"
    ]
}
```
####つぶやき検索
単一
`GET　/text/:id`

全部
`GET　/text/all`

ODataクエリによる検索(最新２０件取得)
`GET　/text/all?$orderby=_created_at desc&$limit=20`

ODataクエリは全て対応しているわけではありません
$filterなど基本的な部分は対応or,andも対応していますが、括弧()を使用する検索は対応していません


<!-- 各チャプター -->
# このWebApiのシステムについて
上記のWebApiはハードコーディングせずに定義を登録することで、WebApiが作成できるシステム上で動いています
例えば、下記のようなJsonを管理者用のAPIにPostするとWebApiが作られます
このシステムについて~~は次回？記事を書こうと思います~~
書きました
[CRUDのWebApi開発は不要！Json登録でWebApiを作れるシステムを作った話](https://qiita.com/HawkClaws/items/6f5a6938318fb7d7983d)


```text.json
{
	"apiSecret": "HelloWorld",
	"apiUrl":"text",
	"jsonSchema": {
        "additionalProperties":false,
		"type": "object",
		"properties": {
			"text": {
                "description": "投稿する文章",
				"type": "string",
                "minLength": 1,
                "maxLength": 280
			},
            "in_reply_to_user_id": {
                "description": "返信対象のUserId",
				"type": "string",
                "minLength": 40,
                "maxLength": 40
			},            
            "in_reply_to_text_id": {
                "description": "返信対象のTextId",
				"type": "string",
                "minLength": 36,
                "maxLength": 36
			}
		},
		"required": [
			"text"
		]
	},
	"methodSettings": [
		{
			"httpMethod": "GET",
			"behavior": "Allow"
		},
        {
			"httpMethod": "POST",
			"behavior": "Authorization"
		},
        {
			"httpMethod": "PUT",
			"behavior": "NotImplemented"
		},
        {
			"httpMethod": "DELETE",
			"behavior": "NotImplemented"
		}
	]
}
```

```user.json
{
	"apiSecret": "",
	"apiUrl":"user",
	"jsonSchema": {
        "additionalProperties":false,
		"type": "object",
		"properties": {
			"name": {
                "description": "ユーザー名",
				"type": "string",
                "maxLength": 30
			},
            "description": {
                "description": "自己紹介文",
				"type": "string",
                "maxLength": 300
			}
		},
		"required": [
			"name",
			"description"
		]
	},
	"methodSettings": [
		{
			"httpMethod": "GET",
			"behavior": "Allow"
		},
        {
			"httpMethod": "POST",
			"behavior": "IptoId"
		},
        {
			"httpMethod": "PUT",
			"behavior": "IptoId"
		},
        {
			"httpMethod": "DELETE",
			"behavior": "NotImplemented"
		}
	]
}
```