2 次代码提交 9e0d78ca1c ... 23e5fd3125

作者 SHA1 备注 提交日期
  bob.yuxinyang 23e5fd3125 feat(auth): support bearer token pass via query parameter 1 月之前
  bob.yuxinyang 4b8c1cae08 feat(session): add location info fields to timeline events 1 月之前
共有 3 个文件被更改,包括 39 次插入17 次删除
  1. 6 0
      handlers/session_handler.go
  2. 7 3
      middleware/auth.go
  3. 26 14
      models/session.go

+ 6 - 0
handlers/session_handler.go

@@ -122,6 +122,10 @@ func (h *SessionHandler) CreateSession(c *gin.Context) {
 			event.LocalFilePath = ""
 			event.VoiceStartOffsetMs = input.VoiceStartOffsetMs
 			event.VoiceEndOffsetMs = input.VoiceEndOffsetMs
+			event.LocationName = input.LocationName
+			event.LocationAddress = input.LocationAddress
+			event.Latitude = input.Latitude
+			event.Longitude = input.Longitude
 			if event.ID == "" {
 				if err := tx.Create(&event).Error; err != nil {
 					return err
@@ -226,6 +230,8 @@ func (h *SessionHandler) AddEventToSession(c *gin.Context) {
 		RelativeTimeMs: req.RelativeTimeMs, EventType: req.EventType,
 		TextContent: req.TextContent, VoiceStartOffsetMs: req.VoiceStartOffsetMs,
 		VoiceEndOffsetMs: req.VoiceEndOffsetMs,
+		LocationName:     req.LocationName, LocationAddress: req.LocationAddress,
+		Latitude: req.Latitude, Longitude: req.Longitude,
 	}
 	if err := h.DB.Where("session_id = ? AND client_id = ?", session.ID, req.ClientID).
 		Assign(event).FirstOrCreate(&event).Error; err != nil {

+ 7 - 3
middleware/auth.go

@@ -14,9 +14,13 @@ func Auth(cfg *config.Config) gin.HandlerFunc {
 	return func(c *gin.Context) {
 		authHeader := c.GetHeader("Authorization")
 		if authHeader == "" {
-			c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "missing authorization header"})
-			c.Abort()
-			return
+			if queryToken := c.Query("token"); queryToken != "" {
+				authHeader = "Bearer " + queryToken
+			} else {
+				c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "missing authorization header"})
+				c.Abort()
+				return
+			}
 		}
 
 		parts := strings.Split(authHeader, " ")

+ 26 - 14
models/session.go

@@ -36,6 +36,10 @@ type TimelineEvent struct {
 	LocalFilePath      string    `gorm:"size:500" json:"localFilePath,omitempty"`
 	VoiceStartOffsetMs *int64    `json:"voiceStartOffsetMs,omitempty"`
 	VoiceEndOffsetMs   *int64    `json:"voiceEndOffsetMs,omitempty"`
+	LocationName       string    `gorm:"size:200" json:"locationName,omitempty"`
+	LocationAddress    string    `gorm:"size:500" json:"locationAddress,omitempty"`
+	Latitude           *float64  `json:"latitude,omitempty"`
+	Longitude          *float64  `json:"longitude,omitempty"`
 	CreatedAt          time.Time `gorm:"autoCreateTime" json:"createdAt"`
 }
 
@@ -68,21 +72,29 @@ type CreateSessionRequest struct {
 }
 
 type CreateEventSubSchema struct {
-	ClientID           string `json:"clientId" binding:"required"`
-	RelativeTimeMs     int64  `json:"relativeTimeMs"`
-	EventType          string `json:"eventType" binding:"required"`
-	TextContent        string `json:"textContent"`
-	LocalFilePath      string `json:"localFilePath"`
-	VoiceStartOffsetMs *int64 `json:"voiceStartOffsetMs"`
-	VoiceEndOffsetMs   *int64 `json:"voiceEndOffsetMs"`
+	ClientID           string   `json:"clientId" binding:"required"`
+	RelativeTimeMs     int64    `json:"relativeTimeMs"`
+	EventType          string   `json:"eventType" binding:"required"`
+	TextContent        string   `json:"textContent"`
+	LocalFilePath      string   `json:"localFilePath"`
+	VoiceStartOffsetMs *int64   `json:"voiceStartOffsetMs"`
+	VoiceEndOffsetMs   *int64   `json:"voiceEndOffsetMs"`
+	LocationName       string   `json:"locationName"`
+	LocationAddress    string   `json:"locationAddress"`
+	Latitude           *float64 `json:"latitude"`
+	Longitude          *float64 `json:"longitude"`
 }
 
 type CreateEventRequest struct {
-	ClientID           string `json:"clientId" binding:"required"`
-	RelativeTimeMs     int64  `json:"relativeTimeMs"`
-	EventType          string `json:"eventType" binding:"required"`
-	TextContent        string `json:"textContent"`
-	LocalFilePath      string `json:"localFilePath"`
-	VoiceStartOffsetMs *int64 `json:"voiceStartOffsetMs"`
-	VoiceEndOffsetMs   *int64 `json:"voiceEndOffsetMs"`
+	ClientID           string   `json:"clientId" binding:"required"`
+	RelativeTimeMs     int64    `json:"relativeTimeMs"`
+	EventType          string   `json:"eventType" binding:"required"`
+	TextContent        string   `json:"textContent"`
+	LocalFilePath      string   `json:"localFilePath"`
+	VoiceStartOffsetMs *int64   `json:"voiceStartOffsetMs"`
+	VoiceEndOffsetMs   *int64   `json:"voiceEndOffsetMs"`
+	LocationName       string   `json:"locationName"`
+	LocationAddress    string   `json:"locationAddress"`
+	Latitude           *float64 `json:"latitude"`
+	Longitude          *float64 `json:"longitude"`
 }