Skip to content
This repository has been archived by the owner on Nov 28, 2023. It is now read-only.

Commit

Permalink
prepare
Browse files Browse the repository at this point in the history
  • Loading branch information
abcang committed Nov 25, 2023
1 parent 6486a75 commit e8af960
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 16 deletions.
16 changes: 4 additions & 12 deletions go/reaction_handler.go
Expand Up @@ -146,29 +146,21 @@ func postReactionHandler(c echo.Context) error {
}

func fillReactionResponse(ctx context.Context, tx *sqlx.Tx, reactionModel ReactionModel) (Reaction, error) {
userModel := UserModel{}
if err := tx.GetContext(ctx, &userModel, "SELECT * FROM users WHERE id = ?", reactionModel.UserID); err != nil {
return Reaction{}, err
}
user, err := fillUserResponse(ctx, tx, userModel)
user, err := fetchUserResponseWithCacheFixed(reactionModel.UserID)
if err != nil {
return Reaction{}, err
}

livestreamModel := LivestreamModel{}
if err := tx.GetContext(ctx, &livestreamModel, "SELECT * FROM livestreams WHERE id = ?", reactionModel.LivestreamID); err != nil {
return Reaction{}, err
}
livestream, err := fillLivestreamResponse(ctx, tx, livestreamModel)
livestream, err := fetchLivestreamResponseWithCacheFixed(reactionModel.LivestreamID)
if err != nil {
return Reaction{}, err
}

reaction := Reaction{
ID: reactionModel.ID,
EmojiName: reactionModel.EmojiName,
User: user,
Livestream: livestream,
User: *user,
Livestream: *livestream,
CreatedAt: reactionModel.CreatedAt,
}

Expand Down
87 changes: 83 additions & 4 deletions go/user_handler.go
Expand Up @@ -488,13 +488,24 @@ func verifyUserSession(c echo.Context) error {
}

func fillUserResponse(ctx context.Context, tx *sqlx.Tx, userModel UserModel) (User, error) {
themeModel := ThemeModel{}
if err := tx.GetContext(ctx, &themeModel, "SELECT * FROM themes WHERE user_id = ?", userModel.ID); err != nil {
return User{}, err
user, err := fillUserResponseBase(ctx, userModel)
if err != nil {
return user, err
}

iconHash, err := getIconImageHashWithCache(userModel.ID)
if err != nil {
return user, err
}

user.IconHash = iconHash

return user, nil
}

func fillUserResponseBase(ctx context.Context, userModel UserModel) (User, error) {
themeModel := ThemeModel{}
if err := dbConn.GetContext(ctx, &themeModel, "SELECT * FROM themes WHERE user_id = ?", userModel.ID); err != nil {
return User{}, err
}

Expand All @@ -507,7 +518,75 @@ func fillUserResponse(ctx context.Context, tx *sqlx.Tx, userModel UserModel) (Us
ID: themeModel.ID,
DarkMode: themeModel.DarkMode,
},
IconHash: iconHash,
IconHash: "",
}

return user, nil
}

func fetchUserResponse(userID int64) (*User, error) {
ctx := context.Background()
userModel := UserModel{}
if err := dbConn.GetContext(ctx, &userModel, "SELECT * FROM users WHERE id = ?", userID); err != nil {
return nil, err
}
user, err := fillUserResponseBase(ctx, userModel)
if err != nil {
return nil, err
}

return &user, nil
}

var userCacheSize = 100 * 1024 * 1024
var userCache = freecache.NewCache(userCacheSize)

func fetchUserResponseWithCache(userID int64) (*User, error) {
key := fmt.Sprintf("live_stream_%d", int(userID))
v, err, _ := group.Do(key, func() (interface{}, error) {
got, err := userCache.Get([]byte(key))
if err == nil {
user := User{}
err = json.Unmarshal(got, &user)
if err != nil {
return nil, err
}

return &user, nil
}

user, err := fetchUserResponse(userID)
if err != nil {
return nil, err
}

userJson, err := json.Marshal(*user)
if err != nil {
return nil, err
}

// 60秒キャッシュ
userCache.Set([]byte(key), []byte(userJson), 60)

return user, nil
})

if err != nil {
return nil, err
}
return v.(*User), nil
}

func fetchUserResponseWithCacheFixed(userID int64) (*User, error) {
user, err := fetchUserResponseWithCache(userID)
if err != nil {
return user, err
}

iconHash, err := getIconImageHashWithCache(user.ID)
user.IconHash = iconHash
if err != nil {
return user, err
}

return user, nil
Expand Down

0 comments on commit e8af960

Please sign in to comment.