Skip to content

Instantly share code, notes, and snippets.

@duangsuse
Last active May 25, 2018 06:20
Show Gist options
  • Save duangsuse/969cc82e8bfb4d2e00ad466e1e7f876e to your computer and use it in GitHub Desktop.
Save duangsuse/969cc82e8bfb4d2e00ad466e1e7f876e to your computer and use it in GitHub Desktop.
GeekApk Data Structure and push set-up

WebHooks

考虑一下之前的几个 WebHooks API: onReplyToUser onReplyToMessage onNewCommentApp

还是觉得不必要储存在数据库里,而且为了性能考虑不应该每次用户发布信息的时候都查询数据库,如果用 lazy static 的话 Rust 的安全规则初始化后是不能动态改变的

考虑可以放在环境变量里,这样

WEBHOOKS='replyToUser:10:https://foo.com/hook;replyToMessage:2333:https://bar.org/bot;commentApp:23:https://geekbot.com/webhook;'

类似这种语法

log -> ('replyToMessage' | 'commentApp') ':' id ':' url ';'
file -> [log]

解析直接以 ';' split 语句然后再切分就可以了

Realtime

散步的时候安排了一下新推送程序的功能 新计划只有使用用户 IDpassword 登录,服务器会在被 回复/提到/被跟随/消息星标 的时候发送空消息让客户端检查收件 这是主要功能

另外还有 查询在线人数/是否在线/临时送信 的功能 客户端可以发送 o 查询在线人数、 o? 查询在线 UID 列表、 o? [以空格切分的 UID 列表] 查询是否在线 UID:message 即时发送信息

Timeline

0 Follow 了某 UID
1 Star 了某 Comment
2 发布了某 Comment
3 更新了某 Comment
4 创建了某 App
5 发布了某 App 的更新
6 删除了某 App
7 Star 了某 App

Timeline 记录的信息

PostgreSQL+Rust(Diesel) GeekApk 数据结构

USER

User up

CREATE TABLE users(
  id SMALLSERIAL PRIMARY KEY,
  simplename VARCHAR NOT NULL,
  avatar_url VARCHAR,
  name VARCHAR NOT NULL,
  alias VARCHAR,
  github VARCHAR NOT NULL,
  bio VARCHAR NOT NULL DEFAULT '这个基友很强,居然没写介绍 QAQ',
  dev_bio VARCHAR,
  created_at TIMESTAMP NOT NULL DEFAULT now(),
  online_at TIMESTAMP NOT NULL DEFAULT now(),

  followers_num SMALLINT NOT NULL DEFAULT 0
)

User down

DROP TABLE users

Rust Struct

#[derive(Queryable)]
pub struct User {
    pub id: i16,
    pub simplename: String,
    pub avatar_url: Option<String>,
    pub name: String,
    pub alias: Option<String>,
    pub github: String,
    pub bio: String,
    pub dev_bio: Option<String>,
    pub created_at: SystemTime,
    pub updated_at: SystemTime
    // cache
    pub followers_num: i16
}

FOLLOW

Follow up

CREATE TABLE follow(
  user SMALLINT NOT NULL,
  target SMALLINT NOT NULL
)

Follow down

DROP TABLE follow

Rust struct

#[derive(Queryable)]
pub struct Follow {
    pub user: i16,
    pub target: i16
}

SECURITY

Security up

CREATE TABLE security(
  user SMALLINT PRIMARY KEY,
  hash VARCHAR NOT NULL,
  password VARCHAR
)

Security down

DROP TABLE security

Rust struct

#[derive(Queryable)]
pub struct Security {
    pub user: i16,
    pub hash: String,
    pub password: Option<String>
}

CATEGORY

Category up

CREATE TABLE categories(
  id SMALLSERIAL PRIMARY KEY,
  name VARCHAR NOT NULL,
  parent SMALLSERIAL NOT NULL
)

Category down

DROP TABLE categories

Rust struct

#[derive(Queryable)]
pub struct Category {
    pub id: i16,
    pub name: String,
    pub parent: i16
}

APP

App up

CREATE TABLE apps(
  id SMALLSERIAL PRIMARY KEY,
  user SMALLINT NOT NULL,
  category SMALLINT NOT NULL,
  name VARCHAR NOT NULL,
  alias VARCHAR,
  package VARCHAR NOT NULL,
  icon_url VARCHAR,
  description VARCHAR NOT NULL,
  visualizer VARCHAR,
  optlabel VARCHAR,
  special VARCHAR,
  previews VARCHAR,
  permissions VARCHAR,
  size INTEGER NOT NULL DEFAULT 0,
  star_num SMALLINT NOT NULL DEFAULT 0,
  comment_num INTEGER NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT now(),
  updated_at TIMESTAMP NOT NULL DEFAULT now()
)

App down

DROP TABLE apps

Rust struct

#[derive(Queryable)]
pub struct App {
    pub id: i16,
    pub user: i16,
    pub category: i16,
    pub name: String,
    pub alias: Option<String>,
    pub package: String,
    pub icon_url: Option<String>,
    pub description: String,
    pub visualizer: Option<String>,
    pub optlabel: Option<String>,
    pub special: Option<String>,

    pub previews: Option<String>,
    pub permissions: Option<String>,
    pub size: i32,

    pub star_num: i16,
    pub comment_num: i32,

    pub created_at: SystemTime,
    pub updated_at: SystemTime
}

UPDATE

Update up

CREATE TABLE updates(
  app SMALLINT NOT NULL,
  version VARCHAR NOT NULL,
  reversion SMALLINT NOT NULL,
  install_url VARCHAR NOT NULL,
  updates VARCHAR,
  api_min SMALLINT,
  api_target SMALLINT
)

Update down

DROP TABLE updates

Rust struct

#[derive(Queryable)]
pub struct Update {
    pub app: i16,
    pub version: String,
    pub reversion: i16,
    pub install_url: String,
    pub updates: Option<String>,
    pub api_min: Option<i16>,
    pub api_target: Option<i16>
}

STAR

Star up

CREATE TABLE stars(
  user SMALLINT NOT NULL,
  app SMALLINT NOT NULL
)

Star down

DROP TABLE stars

Rust struct

#[derive(Queryable)]
pub struct Star {
    user: i16,
    app: i16
}

COMMENT

Comment up

CREATE TABLE comments(
  id SERIAL PRIMARY KEY,
  user SMALLINT NOT NULL,
  app SMALLINT NOT NULL,
  reply INTEGER,
  content VARCHAR NOT NULL,
  stars_num SMALLINT NOT NULL DEFAULT 0,
  replies_num INTEGER NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT now(),
  updated_at TIMESTAMP
)

Comment down

DROP TABLE comments

Rust struct

#[derive(Queryable)]
pub struct Comment {
    id: i32,
    user: i16,
    app: i16,
    reply: Option<i32>,
    content: String,
    stars_num: i16,
    replies_num: i32,
    created_at: SystemTime,
    updated_at: Option<SystemTime>
}

COMMENT_STAR

Comment star up

CREATE TABLE comment_stars(
  user SMALLINT NOT NULL,
  comment INTEGER NOT NULL
)

Comment star down

DROP TABLE comment_stars

Rust struct

#[derive(Queryable)]
pub struct CommentStar {
    user: i16,
    comment: i32
}

TIMELINE

Timeline up

CREATE TABLE timeline(
  user SMALLINT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT now(),
  line_type SMALLINT NOT NULL,
  data INTEGER NOT NULL
)

Timeline down

DROP TABLE timeline

Rust struct

#[derive(Queryable)]
pub struct Timeline {
    user: i16,
    created_at: SystemTime,
    line_type: i16,
    data: i32
}

MAILBOX

Mailbox up

CREATE TABLE mailbox(
    user SMALLINT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT now(),
    mail_type SMALLINT NOT NULL,
    data: INTEGER NOT NULL
)

Mailbox down

DROP TABLE mailbox

Rust struct

#[derive(Queryable)]
pub struct Mailbox {
    user: i16,
    created_at: SystemTime,
    mail_type: i16,
    data: i32
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment