Skip to content

Latest commit

 

History

History
85 lines (65 loc) · 2.74 KB

add-routes.asc

File metadata and controls

85 lines (65 loc) · 2.74 KB

路由

打开 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 空对象。

TwitterController

index 动作里,我们要提取 telegram 用户的 id 及消息内容:

  def index(conn, %{"message" => %{"from" => %{"id" => from_id}, "text" => text}}) do
    json(conn, %{})
  end

这里利用 模式匹配提取用户 idtext 内容。

我们第一个要处理的 text 将是 /start - 用户添加 telegram 发推机器人时,telegram 客户端会自动发起该消息。

index 在接收到 /start 后,要做几个判断:

  1. 检查数据库中是否已经存在该 from_id,如果没有,表示用户未授权,此时应启动 twitter 的 OAuth 流程;

  2. 如果数据库中存在该 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