Skip to content

Commit

Permalink
feat: 完成数据表设计,同步实体类和类型声明
Browse files Browse the repository at this point in the history
  • Loading branch information
CaoMeiYouRen committed Sep 29, 2024
1 parent 8148181 commit d9d2a1c
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 50 deletions.
7 changes: 7 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,10 @@ jobs:
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
platforms: linux/amd64,linux/arm64
- name: Docker Hub README & description sync
uses: meeDamian/sync-readme@v1.0.6
with:
user: ${{ secrets.DOCKER_USERNAME }}
pass: ${{ secrets.DOCKER_PASSWORD }}
slug: ${{ github.repository }}
description: "一个基于 Hono 实现的云函数版本的微信公众号助手"
11 changes: 10 additions & 1 deletion src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ import { HTTPException } from 'hono/http-exception'
import { StatusCode } from 'hono/utils/http-status'
import { cors } from 'hono/cors'
import { secureHeaders } from 'hono/secure-headers'
import { TIMEOUT } from './env'
import { __DEV__, TIMEOUT } from './env'
import { winstonLogger } from './utils/logger'
import { event } from './routes/event'
import { getDataSource } from './db'

const app = new Hono()

Expand Down Expand Up @@ -55,4 +56,12 @@ app.all('/', (c) => c.json({

app.route('/event', event)

__DEV__ && app.post('/synchronize', async (c) => {
const dataSource = await getDataSource()
await dataSource.synchronize()
return c.json({
message: 'OK',
})
})

export default app
8 changes: 7 additions & 1 deletion src/db/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@ import { DataSource } from 'typeorm'
import { SnakeCaseNamingStrategy } from './naming-strategy'
import { SubscribeEvent, SubscribeAndScanEvent, ScanEvent, LocationEvent, ClickEvent, ViewEvent } from './models/event'
import { TextMessage, ImageMessage, VoiceMessage, VideoMessage, ShortvideoMessage, LocationMessage, LinkMessage } from './models/message'
import { __DEV__ } from '@/env'
import { Base, BaseEvent, BaseMessage } from './models/base'
import { __DEV__, DATABASE_URL } from '@/env'

let dataSource: DataSource

export async function getDataSource() {
if (!dataSource) {
dataSource = new DataSource({
type: 'postgres',
url: DATABASE_URL,
// 实体类
entities: [
Base,
BaseEvent,
BaseMessage,
TextMessage,
ImageMessage,
VoiceMessage,
Expand All @@ -34,6 +39,7 @@ export async function getDataSource() {
namingStrategy: new SnakeCaseNamingStrategy(),
// 解析 int8 到 number
parseInt8: true,
logger: __DEV__ ? 'debug' : 'simple-console',
})
}
await dataSource.initialize()
Expand Down
24 changes: 16 additions & 8 deletions src/db/models/base.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { PrimaryGeneratedColumn, Column } from 'typeorm'
import { PrimaryGeneratedColumn, Column, Entity, TableInheritance, ChildEntity } from 'typeorm'
import { IBaseMessage } from '@/interfaces/wexin-message'
import { IBaseEvent } from '@/interfaces/wexin-event'

// @Entity()
@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export class Base {
@PrimaryGeneratedColumn()
id: number
Expand All @@ -19,18 +22,23 @@ export class Base {

}

export class BaseEvent extends Base {
// @Column({ type: 'varchar', length: 50, nullable: false })
// event: string
@ChildEntity()
export class BaseEvent extends Base implements IBaseEvent {

declare msgType: 'event'

@Column({ type: 'varchar', length: 50, nullable: false })
event: string
}

export class BaseMessage extends Base {
@ChildEntity()
export class BaseMessage extends Base implements IBaseMessage {
@Column({ type: 'varchar', length: 64, nullable: true })
msgId: string

@Column({ type: 'varchar', length: 64, nullable: true })
msgDataId?: string
msgDataId: string

@Column({ type: 'varchar', length: 10, nullable: true })
idx?: string
idx: string
}
51 changes: 26 additions & 25 deletions src/db/models/event.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { Entity, Column } from 'typeorm'
import { Column, ChildEntity } from 'typeorm'
import { BaseEvent } from './base'
import { IClickEvent, ILocationEvent, IScanEvent, ISubscribeAndScanEvent, ISubscribeEvent, IViewEvent } from '@/interfaces/wexin-event'

@Entity()
export class SubscribeEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'subscribe' | 'unsubscribe'
@ChildEntity()
export class SubscribeEvent extends BaseEvent implements ISubscribeEvent {

declare event: 'subscribe' | 'unsubscribe'
}

@Entity()
export class SubscribeAndScanEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'subscribe'
@ChildEntity()
export class SubscribeAndScanEvent extends BaseEvent implements ISubscribeAndScanEvent {

declare event: 'subscribe'

@Column({ type: 'varchar', length: 255, nullable: true })
eventKey: string
Expand All @@ -19,10 +20,10 @@ export class SubscribeAndScanEvent extends BaseEvent {
ticket: string
}

@Entity()
export class ScanEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'SCAN'
@ChildEntity()
export class ScanEvent extends BaseEvent implements IScanEvent {

declare event: 'SCAN'

@Column({ type: 'varchar', length: 255, nullable: true })
eventKey: string
Expand All @@ -31,10 +32,10 @@ export class ScanEvent extends BaseEvent {
ticket: string
}

@Entity()
export class LocationEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'LOCATION'
@ChildEntity()
export class LocationEvent extends BaseEvent implements ILocationEvent {

declare event: 'LOCATION'

@Column({ type: 'varchar', length: 255, nullable: true })
latitude: string
Expand All @@ -46,19 +47,19 @@ export class LocationEvent extends BaseEvent {
precision: string
}

@Entity()
export class ClickEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'CLICK'
@ChildEntity()
export class ClickEvent extends BaseEvent implements IClickEvent {

declare event: 'CLICK'

@Column({ type: 'varchar', length: 255, nullable: true })
eventKey: string
}

@Entity()
export class ViewEvent extends BaseEvent {
@Column({ type: 'varchar', length: 50, nullable: true })
event: 'VIEW'
@ChildEntity()
export class ViewEvent extends BaseEvent implements IViewEvent {

declare event: 'VIEW'

@Column({ type: 'varchar', length: 255, nullable: true })
eventKey: string
Expand Down
52 changes: 37 additions & 15 deletions src/db/models/message.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,69 @@
import { Entity, Column } from 'typeorm'
import { Column, ChildEntity } from 'typeorm'
import { BaseMessage } from './base'
import { IImageMessage, ILinkMessage, ILocationMessage, IShortvideoMessage, ITextMessage, IVideoMessage, IVoiceMessage } from '@/interfaces/wexin-message'

@ChildEntity()
export class TextMessage extends BaseMessage implements ITextMessage {

declare msgType: 'text'

@Entity()
export class TextMessage extends BaseMessage {
@Column({ type: 'varchar', length: 1024, nullable: true })
content: string
}

@Entity()
export class ImageMessage extends BaseMessage {
@ChildEntity()
export class ImageMessage extends BaseMessage implements IImageMessage {

declare msgType: 'image'

@Column({ type: 'varchar', length: 255, nullable: true })
picUrl: string

@Column({ type: 'varchar', length: 255, nullable: true })
mediaId: string
}

@Entity()
export class VoiceMessage extends BaseMessage {
@ChildEntity()
export class VoiceMessage extends BaseMessage implements IVoiceMessage {

declare msgType: 'voice'

@Column({ type: 'varchar', length: 255, nullable: true })
mediaId: string

@Column({ type: 'varchar', length: 50, nullable: true })
format: string
}

@Entity()
export class VideoMessage extends BaseMessage {
@ChildEntity()
export class VideoMessage extends BaseMessage implements IVideoMessage {

declare msgType: 'video'

@Column({ type: 'varchar', length: 255, nullable: true })
mediaId: string

@Column({ type: 'varchar', length: 255, nullable: true })
thumbMediaId: string
}

@Entity()
export class ShortvideoMessage extends BaseMessage {
@ChildEntity()
export class ShortvideoMessage extends BaseMessage implements IShortvideoMessage {

declare msgType: 'shortvideo'

@Column({ type: 'varchar', length: 255, nullable: true })
mediaId: string

@Column({ type: 'varchar', length: 255, nullable: true })
thumbMediaId: string
}

@Entity()
export class LocationMessage extends BaseMessage {
@ChildEntity()
export class LocationMessage extends BaseMessage implements ILocationMessage {

declare msgType: 'location'

@Column({ type: 'varchar', length: 255, nullable: true })
locationX: string

Expand All @@ -58,8 +77,11 @@ export class LocationMessage extends BaseMessage {
label: string
}

@Entity()
export class LinkMessage extends BaseMessage {
@ChildEntity()
export class LinkMessage extends BaseMessage implements ILinkMessage {

declare msgType: 'link'

@Column({ type: 'varchar', length: 255, nullable: true })
title: string

Expand Down
3 changes: 3 additions & 0 deletions src/interfaces/wexin-event-body.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { CamelCaseObject } from './utils'
import { WexinEvent } from './wexin-event'
import { WexinMessage } from './wexin-message'

export type WexinEventBody = WexinMessage | WexinEvent

export type IWexinEventBody = CamelCaseObject<WexinEventBody>
18 changes: 18 additions & 0 deletions src/interfaces/wexin-event.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { CamelCaseObject } from './utils'

export interface BaseEvent {
/**
*消息类型
Expand All @@ -21,13 +23,17 @@ export interface BaseEvent {
Event: string
}

export type IBaseEvent = CamelCaseObject<BaseEvent>

export interface SubscribeEvent extends BaseEvent {
/**
* 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
*/
Event: 'subscribe' | 'unsubscribe'
}

export type ISubscribeEvent = CamelCaseObject<SubscribeEvent>

/**
* 用户未关注时,进行关注后的事件推送
*
Expand All @@ -48,6 +54,8 @@ export interface SubscribeAndScanEvent extends BaseEvent {
Ticket: string
}

export type ISubscribeAndScanEvent = CamelCaseObject<SubscribeAndScanEvent>

export interface ScanEvent extends BaseEvent {
Event: 'SCAN'
/**
Expand All @@ -60,6 +68,8 @@ export interface ScanEvent extends BaseEvent {
Ticket: string
}

export type IScanEvent = CamelCaseObject<ScanEvent>

export interface LocationEvent extends BaseEvent {
Event: 'LOCATION'
/**
Expand All @@ -76,6 +86,8 @@ export interface LocationEvent extends BaseEvent {
Precision: string
}

export type ILocationEvent = CamelCaseObject<LocationEvent>

/**
* 点击菜单拉取消息时的事件推送
*
Expand All @@ -92,6 +104,8 @@ export interface ClickEvent extends BaseEvent {
EventKey: string
}

export type IClickEvent = CamelCaseObject<ClickEvent>

/**
*点击菜单跳转链接时的事件推送
*
Expand All @@ -108,4 +122,8 @@ export interface ViewEvent extends BaseEvent {
EventKey: string
}

export type IViewEvent = CamelCaseObject<ViewEvent>

export type WexinEvent = SubscribeEvent | SubscribeAndScanEvent | ScanEvent | LocationEvent | ClickEvent | ViewEvent

export type IWexinEvent = CamelCaseObject<WexinEvent>
Loading

0 comments on commit d9d2a1c

Please sign in to comment.