打开 lib/tweet_bot_web/router.ex
文件,添加上一节中我们尚未创建的路由:
lib/tweet_bot_web/router.ex
scope "/api", TweetBotWeb do
pipe_through(:api)
+ post("/twitter", TwitterController, :index)
end
接着在 lib/tweet_bot_web/controllers
目录下新建控制器 twitter_controller.ex
:
lib/tweet_bot_web/controllers/twitter_controller.ex
defmodule TweetBotWeb.TwitterController do
use TweetBotWeb, :controller
def index(conn, _params) do
json(conn, %{})
end
end
我们暂时先响应一个 json 空对象。
在 index
动作里,我们要提取 telegram 用户的 id 及消息内容:
def index(conn, %{"message" => %{"from" => %{"id" => from_id}, "text" => text}}) do
json(conn, %{})
end
这里利用 模式匹配提取用户 id
及 text
内容。
我们第一个要处理的 text
将是 /start
- 用户添加 telegram 发推机器人时,telegram 客户端会自动发起该消息。
而 index
在接收到 /start
后,要做几个判断:
-
检查数据库中是否已经存在该
from_id
,如果没有,表示用户未授权,此时应启动 twitter 的 OAuth 流程; -
如果数据库中存在该
from_id
,说明用户已授权 - 提示用户直接发送消息。
也就是说,我们在数据库中要存储 from_id
数据,此外还要存储用户授权后从 twitter 获得的 access_token
。
那么要手写 Scheme 吗?当然不,用 mix tasks 吧:
$ mix phx.gen.context Accounts User users from_id:string:unique access_token:string
* creating lib/tweet_bot/accounts/user.ex
* creating priv/repo/migrations/20181203113027_create_users.exs
* creating lib/tweet_bot/accounts/accounts.ex
* injecting lib/tweet_bot/accounts/accounts.ex
* creating test/tweet_bot/accounts/accounts_test.exs
* injecting test/tweet_bot/accounts/accounts_test.exs
Remember to update your repository by running migrations:
$ mix ecto.migrate
这样我们就新建了一个 Accounts
上下文,以及 User
结构。
打开 priv/repo/migrations/20181203113027_create_users.exs
文件,调整 from_id
:
priv/repo/migrations/20181203113027_create_users.exs
- field :from_id, :string
+ field :from_id, :string, null: false
接着再运行 mix ecto.migrate
创建 users
表:
$ mix ecto.migrate
[info] == Running TweetBot.Repo.Migrations.CreateUsers.change/0 forward
[info] create table users
[info] create index users_from_id_index
[info] == Migrated in 0.0s