短暂回顾
现在是时候回到我们在本章开头起草的计划了;
- 编写一个模块来发送电子邮件
- 调整现有 POST /subscriptions 请求处理程序的逻辑以适应新的需求
- 从头编写一个 GET /subscriptions/confirm 请求处理程序
第一项已完成,接下来该处理剩下的两项了。
我们之前已经画好了这两个处理程序的工作原理图:
POST /subscriptions 将:
- • 将订阅者详细信息添加到数据库的 subscriptions 表中,状态等于 pending_confirmation
- • 生成一个(唯一的)subscription_token
- • 将 subscription_token 存储在数据库中,并与 subscription_tokens 表中的订阅者 ID 对应
- • 向新订阅者发送一封电子邮件,其中包含结构为
https://<our-api-domain>/subscriptions/confirm?token=<subscription_token>的链接 - • 返回 200 OK
一旦订阅者点击该链接,浏览器标签页将打开,并向我们的 GET /subscriptions/confirm 端点发送 GET 请求。请求处理程序将:
- 从查询参数中检索 subscription_token
- 从 subscription_tokens 表中检索与 subscription_token 关联的订阅者 ID
- 在 subscriptions 表中将订阅者状态从 pending_confirmation 更新为 active
- 返回 200 OK
这让我们对应用程序在实现完成后的工作方式有了相当精确的了解。
但这对我们弄清楚如何实现目标并没有多大帮助。
我们应该从哪里开始?
我们应该立即处理 /subscriptions 的变更吗?
我们应该先处理 /subscriptions/confirm 吗?
我们需要找到一条可以零停机时间上线的实现路线。