Gist中多文件的同步问题
上面有提到,想要在一个Gist中添加多篇博客文章,实现专栏的效果。
同步的时候,自然也需要做一些相应的修改。
文件唯一标识
Gist的接口中,对于多文件,会返回如下内容:
1"files": { 2 "first-file.series.md": { 3 "filename": "first-file.series.md", 4 "type": "text/markdown", 5 "language": "Markdown", 6 "raw_url": "https://gist.githubusercontent.com/banyudu/9524f2486ec498e57cf6201680005a8c/raw/15fb1b41aea54c13333031247db319fcbc80f94c/first-file.series.md", 7 "size": 17 8 }, 9 "second-file.series.md": { 10 "filename": "second-file.series.md", 11 "type": "text/markdown", 12 "language": "Markdown", 13 "raw_url": "https://gist.githubusercontent.com/banyudu/9524f2486ec498e57cf6201680005a8c/raw/d2dccd05f6dfb4700154bb5e7b8db8906437a9df/second-file.series.md", 14 "size": 7 15 } 16},
从上面可以看到,files中没有什么唯一id之类的东西,只有 filename 和 raw_url 有可能被作为唯一标识。
最开始我想到用 raw_url 中的 "raw" 和 文件名之间的一串id作为其唯一标识,但是实验发现,这串id是代表的历史版本信息,每次编辑文件之后,这个信息会发生变化。所以不能用它来唯一代表文件。
那文件名呢?
我测试了下将在同一个gist中添加两个相同的文件名,会发生下面的报错:
说明文件名是唯一的。
那么我们就可以将 gistId + filename 作为一篇博客的唯一标识。raw_url 作为其内容是否有更改的判断依据。
文件增删及更新的处理
Gist中的文件有可能会出现增删、也有可能出现重命名(也可认为是一次增删)。
那么专栏中的博客列表也需要跟随变化。
这里我想到的处理办法,是在Series表中存储文件列表及raw_url,在每次同步的时候,获取到最新的文件列表和raw_url,如果发现文件列表不匹配,则根据差异做相应的删除和添加的操作。
这里删除之后,博客相应的评论也会失效,需要谨慎处理。
一方面可以做成软删除,另一方面也可以人为地约束,不随便在Gist中修改文件名称。
如果发现文件名匹配但是raw_url不匹配,说明其内容有更新,正常更新其内容和最后更新时间即可。
总结
总结以上几点,需要做如下的变更:
- 添加Series表,存储Series名称、文件列表(filename + raw_url + 内部的blog id)
- Blog表中添加deleted字段,表示软删除,添加series字段,作为一个冗余字段,方便在同步的时候标记删除。
- 同步Series的时候,对应的Blog的id从原来的gistId变成gistId + filename,原来的单个文件的id还保持不变。
- 同步Series的时候,根据raw_url是否匹配来决定文件是否有更新。而不是根据整个Gist的更新时间。
- 同步Series的时候,博客的标题从Gist标题换成内部的第一个 h1 标题,同时在存储内容的时候,需要将这个h1标题去掉。