mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-27 05:52:29 +08:00 
			
		
		
		
	* fix: GroupApplicationAcceptedNotification * fix: GroupApplicationAcceptedNotification * fix: NotificationUserInfoUpdate * cicd: robot automated Change * fix: component * fix: getConversationInfo * feat: cron task * feat: cron task * feat: cron task * feat: cron task * feat: cron task * fix: minio config url recognition error * update gomake version * update gomake version * fix: seq conversion bug * fix: redis pipe exec * fix: ImportFriends * fix: A large number of logs keysAndValues length is not even * feat: mark read aggregate write * feat: online status supports redis cluster * feat: online status supports redis cluster * feat: online status supports redis cluster * merge * merge * read seq is written to mongo * read seq is written to mongo * fix: invitation to join group notification * fix: friend op_user_id * feat: optimizing asynchronous context * feat: optimizing memamq size * feat: add GetSeqMessage * feat: GroupApplicationAgreeMemberEnterNotification * feat: GroupApplicationAgreeMemberEnterNotification * feat: go.mod * feat: go.mod * feat: join group notification and get seq * feat: join group notification and get seq * feat: avoid pulling messages from sessions with a large number of max seq values of 0 * feat: API supports gzip * go.mod * fix: nil pointer error on close * fix: listen error * fix: listen error * update go.mod * feat: add log * fix: token parse token value * fix: GetMsgBySeqs boundary issues * fix: sn_ not sort * fix: sn_ not sort * fix: sn_ not sort * fix: jssdk add * fix: jssdk support * fix: jssdk support * fix: jssdk support --------- Co-authored-by: withchao <withchao@users.noreply.github.com>
		
			
				
	
	
		
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package jssdk
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| 	"github.com/openimsdk/tools/a2r"
 | |
| 	"github.com/openimsdk/tools/apiresp"
 | |
| 	"github.com/openimsdk/tools/checker"
 | |
| 	"github.com/openimsdk/tools/errs"
 | |
| 	"google.golang.org/grpc"
 | |
| 	"google.golang.org/protobuf/proto"
 | |
| 	"io"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func field[A, B, C any](ctx context.Context, fn func(ctx context.Context, req *A, opts ...grpc.CallOption) (*B, error), req *A, get func(*B) C) (C, error) {
 | |
| 	resp, err := fn(ctx, req)
 | |
| 	if err != nil {
 | |
| 		var c C
 | |
| 		return c, err
 | |
| 	}
 | |
| 	return get(resp), nil
 | |
| }
 | |
| 
 | |
| func call[A, B any](c *gin.Context, fn func(ctx context.Context, req *A) (*B, error)) {
 | |
| 	var isJSON bool
 | |
| 	switch contentType := c.GetHeader("Content-Type"); {
 | |
| 	case contentType == "":
 | |
| 		isJSON = true
 | |
| 	case strings.Contains(contentType, "application/json"):
 | |
| 		isJSON = true
 | |
| 	case strings.Contains(contentType, "application/protobuf"):
 | |
| 	case strings.Contains(contentType, "application/x-protobuf"):
 | |
| 	default:
 | |
| 		apiresp.GinError(c, errs.ErrArgs.WrapMsg("unsupported content type"))
 | |
| 		return
 | |
| 	}
 | |
| 	var req *A
 | |
| 	if isJSON {
 | |
| 		var err error
 | |
| 		req, err = a2r.ParseRequest[A](c)
 | |
| 		if err != nil {
 | |
| 			apiresp.GinError(c, err)
 | |
| 			return
 | |
| 		}
 | |
| 	} else {
 | |
| 		body, err := io.ReadAll(c.Request.Body)
 | |
| 		if err != nil {
 | |
| 			apiresp.GinError(c, err)
 | |
| 			return
 | |
| 		}
 | |
| 		req = new(A)
 | |
| 		if err := proto.Unmarshal(body, any(req).(proto.Message)); err != nil {
 | |
| 			apiresp.GinError(c, err)
 | |
| 			return
 | |
| 		}
 | |
| 		if err := checker.Validate(&req); err != nil {
 | |
| 			apiresp.GinError(c, err)
 | |
| 			return
 | |
| 		}
 | |
| 	}
 | |
| 	resp, err := fn(c, req)
 | |
| 	if err != nil {
 | |
| 		apiresp.GinError(c, err)
 | |
| 		return
 | |
| 	}
 | |
| 	if isJSON {
 | |
| 		apiresp.GinSuccess(c, resp)
 | |
| 		return
 | |
| 	}
 | |
| 	body, err := proto.Marshal(any(resp).(proto.Message))
 | |
| 	if err != nil {
 | |
| 		apiresp.GinError(c, err)
 | |
| 		return
 | |
| 	}
 | |
| 	apiresp.GinSuccess(c, body)
 | |
| }
 |