首先在你的项目中的graphql文件中编写schema
type Video {
id: ID!
name: String!
}
type Subscription {
videoPublished: Video!
}
然后运行你的gqlgen命令生成新的代码,然后会在generate.go中创建一个接口,最后你需要在解析器中实现该接口,如下所示:
var videoPublishedChannel map[string]chan api.Video
var mutex sync.Mutex
func init() {
videoPublishedChannel = map[string]chan api.Video{}
}
type subscriptionResolver struct{ *Resolver }
func (s *subscriptionResolver) VideoPublished(ctx context.Context) (<-chan api.Video, error) {
id := randx.String(8)
videoEvent := make(chan api.Video, 1)
go func() {
<-ctx.Done()
mutux.Lock()
delete( videoPublishedChannel, id)
mutux.Unlock()
}()
mutux.Lock()
videoPublishedChannel[id] = videoEvent
mutux.Unlock()
return videoEvent, nil
}
func (r *mutationResolver) CreateVideo(ctx context.Context, input NewVideo) (api.Video, error) {
// your logic ...
mutux.Lock()
for _, observer := range videoPublishedChannel {
observer <- newVideo
}
mutux.Unlock()
return newVideo, nil
}