NodePress
RESTful API service for surmon.me blog, powered by nestjs, required mongoDB & Redis.
适用于 surmon.me 的 RESTful API �?务;基于 nestjs (nodejs); 需安装 mongoDB 和 Redis 方�?�完整�?行。
v3.x 使用 nestjs 进行�?构,之�?çš„ nodejs 版本在 æ¤åˆ†æ”¯ã€‚
其他相关项目:
- web client for user: surmon.me powered by Nuxt.js
- web client for admin: angular-admin powered by Angular & Bootstrap
- native app client: surmon.me.native powered by react-native
更新记录:CHANGELOG.md
接�?�文档:API_DOC.md
v3.x 架构说明
接�?�概述
-
HTTP 状�?�?(详�? errors )
400请求的业务被拒�?401鉴�?�失败403�?��?�?è¶³/请求�?�数需�?更高的�?��?404资�?�?å˜åœ¨405æ— æ¤æ–¹æ³•500�?务器挂了200æ£å¸¸201POST æ£å¸¸
-
数�?�特�?�?(详�? http.interface.ts )
status:success:æ£å¸¸error:异常
message:永远返回(由 http.decorator 装饰)error:一般会返回错误�?�生节点的 error;在status为error的时候必须返回,方便调试debug:开�?�模�?下为�?ï¿½ç”Ÿé”™è¯¯çš„å †æ ˆï¼Œç”Ÿäº§æ¨¡ï¿½?�?返回result:在status为success的时候必须返回- 列表数�?�:一般返回
{ pagination: {...}, data: {..} } - 具体数�?ï¿½ï¼šä¾‹å¦‚æ–‡ç« ï¼Œåˆ™åŒ…ï¿½?�直接数�?�如
{ title: '', content: ... }
- 列表数�?�:一般返回
数�?�模型
-
通用
extend为通用扩展(模型在æ¤ï¼‰- æ–‡ç« ï¿½?分类�?Tag 表都包�?� extend å—æ®µï¼Œç”¨äºŽåœ¨ï¿½?��?�管�?�ä¸è‡ªå®šä¹‰æ‰©å±•,类似于 Wordpress ä¸çš„è‡ªå®šä¹‰å—æ®µåŠŸèƒ½ï¼Œç›®ï¿½?用�?�实现�?�?� icon å›¾æ ‡çš„ class 或者其他功能
-
�?�表�?�?å—æ®µ
_id:mongodb 生�?çš„ id,一般用于�?��?�执行 CRUD �?作id:�?�件生�?çš„è‡ªå¢žæ•°å— id,类似 mysql ä¸çš„ id,具有唯一性,用于�?�?�获�?�数�?�pid:父级 id,用于建立数�?�表关系,与 id å—æ®µæ˜ å°„
-
数�?�组�?çš„å‡ ï¿½?�?�能
- 数�?�库真实å˜åœ¨æ•°ï¿½?�
- 业务计算出的数�?�,�?�å˜å‚¨æ•°ï¿½?�,如:统计数�?�
- Mongoose 支�?的 virtual 虚拟数�?�
- 第三方模�?��??供数�?�,如:GitHub�?Bilibili
应用结构
-
入�?�
main.ts:引入�?置,�?�动主程�?,引入�?��?全局�?务app.module.ts:主程�?æ ¹æ¨¡ï¿½?�,负责�?�业务模�?�的�?��?�app.controller.ts:主程�?æ ¹æŽ§åˆ¶å™¨app.config.ts:主程�?�?置,数�?�库�?程�?�?第三方,一切�?��?置项app.environment.ts:全局环境�?��?
-
请求处�?��?程
request:收到请求middleware:ä¸é—´ä»¶è¿‡æ»¤ï¼ˆè·¨åŸŸï¿½?�?��?æ ¡éªŒç‰å¤„�?�)guard:守�?�过滤(鉴�?�)interceptor:before:数�?��?拦截器(本应用为空,�?ï¿½ï¼šæ— å¤„ï¿½?�)pipe:�?�数�??�?ï¿½ï¼ˆæ ¡éªŒï¼‰å™¨controller:业务控制器service:业务�?务interceptor:after:数�?��?æ‹¦æˆªå™¨ï¼ˆæ ¼ï¿½?化数�?��?错误)filter:�?�获以上所有�?程ä¸å‡ºçŽ°çš„å¼‚å¸¸ï¼Œå¦‚æžœä»»ä½•ä¸€ä¸ªçŽ¯èŠ‚æŠ›å‡ºå¼‚å¸¸ï¼Œåˆ™è¿”å›žé”™è¯¯
-
鉴�?�处�?��?程
guard:守�?� 分�?请求guard.canActivate:继承处�?�JwtStrategy.validate:调用 鉴�?��?务guard.handleRequestï¼šæ ¹ï¿½?�鉴�?��?务返回的结果作判æ–处�?�,通行或拦截
-
鉴�?�级别
- 任何高级�?作(CUDï¼‰éƒ½ä¼šæ ¡éªŒå¿…é¡»çš„ Token(代�?�? auth.guard.ts )
- 涉�?�表数�?�读�?�的 GET è¯·æ±‚ä¼šæ™ºèƒ½æ ¡éªŒ Tokenï¼Œæ— Token 或 Token 验�?生效则通行,�?�则�?通行(代�?�? humanized-auth.guard.ts )
-
�?ï¿½æ•°æ ¡éªŒé€»è¾‘ï¼ˆä»£ï¿½?�? query-params.decorator.ts )
- 普通用户使用高级查询�?ï¿½æ•°å°†è¢«è§†ä¸ºæ— ï¿½?��?,返回 403
- 任何用户的请求�?�数�?�?ï¿½æ³•ï¼Œå°†è¢«æ ¡éªŒå™¨æ‹¦æˆªï¼Œè¿”å›ž 400
-
错误过滤器(代�?�? error.filter.ts )
-
拦截器 interceptors
- ç¼“å˜æ‹¦æˆªå™¨ï¼šè‡ªå®šä¹‰è¿™ä¸ªæ‹¦æˆªå™¨æ˜¯æ˜¯ï¿½?弥补框架�?支�? ttl �?�数的缺陷
- 数�?��?转�?�拦截器:当控制器所需的 Promise service �?功�?应时,将在æ¤è¢«è½¬ï¿½?ï¿½ä¸ºæ ‡å‡†çš„æ•°ï¿½?�结构
- 数�?��?异常拦截器:当控制器所需的 Promise service �?�生错误时,错误将在æ¤è¢«ï¿½?�获
- 日志拦截器:代替默认的全局日志
-
装饰器扩展 decorators
- 缓å˜è£…饰器:用于�?ç½®
cache key / cache ttl - 控制器�?应装饰器:用于输出规范化的信�?�,如
messageå’Œ 翻页�?�数数�?� - 请求�?�数�??�?ï¿½å™¨ï¼šç”¨æˆ·è‡ªåŠ¨æ ¡éªŒå’Œæ ¼ï¿½?化请求�?�数,包括
query/params/辅助信�?�
- 缓å˜è£…饰器:用于�?ç½®
-
守�?� guards
- 默认所有�?� GET 请求会使用 Auth 守�?�鉴�?�
- 所有涉�?�到多角色请求的 GET 接�?�会使用 HumanizedJwtAuthGuard 进行鉴�?�
-
ä¸é—´ä»¶ middlewares
- Cors ä¸é—´ä»¶ï¼Œç”¨äºŽå¤„�?�跨域访问
- Origin ä¸é—´ä»¶ï¼Œç”¨äºŽæ‹¦æˆªï¿½?�路�?明请求
-
管�?� pipes
- validation.pipe 用于验�?所有基于 class-validate 的验�?类
-
业务模�?� modules
- 公告
- æ–‡ç«
- 分类
- æ ‡ç¾
- 评论
- �?置
- bilibili:Vlog 业务的请求
- 鉴�?�/登陆:全局鉴�?�业务和 Token 业务
- 点赞:点赞评论�?æ–‡ç« ï¿½?主站
- 音�?ï¼šæ’æ”¾å™¨éŸ³ï¿½?数�?�业务
- �?��?�供稿:负责�?�和信�?�的输出和写入,如 Sitemap�?RSSXML
- �?纸:主站�?日�?纸模�?�业务
- 扩展模�?�
- GitHub:GitHub 项目列表业务
- 统计:业务数�?�统计业务
- 备份:数�?�库备份业务(定时�?手动)
- 其他:其他第三方 token ç‰ï¿½?务
-
æ ¸å¿ƒè¾…åŠ©æ¨¡ï¿½?� processors
- 数�?�库
- 连接数�?�库和异常自动�?试
- ç¼“å˜ / Redis
- åŸºæœ¬çš„ç¼“å˜æ•°ï¿½?� Set�?Get
- 扩展的 Promise 工作模�?(�?��?��?�æ¥/被动更新)
- 扩展的 Interval 工作模�?(超时更新/定时更新)
- 辅助 / Helper
- �?�索引擎实时更新�?åŠ¡ï¼šæ ¹ï¿½?�入�?�主动�??交�?�索引擎收录,支�?百度�?Google �?务;分别会在动�?数�?� 进行 CUD 的时候调用对应方法
- 评论过滤�?务:使用 akismet 过滤 spamï¼›æš´éœ²ä¸‰ä¸ªæ–¹æ³•ï¼šæ ¡éªŒ spam�?�??交 spam�?�??交 ham
- 邮件�?åŠ¡ï¼šæ ¹ï¿½?�入�?��?��?邮件;程�?�?ï¿½åŠ¨æ—¶ä¼šè‡ªåŠ¨æ ¡éªŒå®¢æˆ·ç«¯æœ‰æ•ˆæ€§ï¼Œæ ¡éªŒï¿½?åŠŸåˆ™æ ¹ï¿½?�入�?��?��?邮件
- IP 地�?�查询�?åŠ¡ï¼šæ ¹ï¿½?�入�?�查询 IP 物�?��?置;控制器内优先使用阿里云 IP 查询�?务,当�?åŠ¡æ— æ•ˆï¼Œ
使用本地 GEO 库查询,使用 ip.cn ç‰å¤‡ç”¨æ–¹æ¡ˆ - 第三方云å˜å‚¨ï¿½?务:生�?云å˜å‚¨ä¸Šä¼ Token(目�?�?务为 Aliyun OSS),�?�期�?ï¿½ä»¥æ·»åŠ SDK 的更多支�?,比如管�?�文件
- Google �?书(鉴�?�)�?务:用于生�?�?� Google 应用的�?务端�?书
- 数�?�库
Special issues
Google Indexing API
- 完整的�?置�?程文档
- 「 统计用户的所有者角色 �?æ·»åŠ é¡µï¿½?� 在这里,而�?� 新版的
Google Auth
- OAuth 2.0 客户端 ID�?�?务�?�?�密钥 都是 OAuth 授�?�类型
- Auth 申请�?�管�?�页�?�
Google Analytics Embed API
- 完整文档
- 完整示例
- �?务端ç¾ï¿½?� token 鉴�?�示例
- 客户端 API 文档
- 将�?åŠ¡è´¦æˆ·æ·»åŠ ä¸º GA 的数�?�阅读者�?作页�?�
Development Setup
# 安装
$ yarn
# 开�?�
$ yarn start:dev
# 测试
$ yarn lint
$ yarn test
$ yarn test:e2e
$ yarn test:cov
$ yarn test:watch
# 构建
$ yarn build
# 生产环境�?行
$ yarn start:prod
# 更新 GEO IP 库数�?�
$ yarn updategeodbActions setup
Rule:
any PR open→CI:Build testmaster PR closed & merged→CI:Deploy to server
Example:
local:develop→remote:develop→CI:Build testremote:develop/master→remote:master → merged→CI:Deploy to server

