Skip to content
This repository was archived by the owner on Dec 3, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 107 additions & 7 deletions webapp/go/livecomment_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,19 @@ func getLivecommentsHandler(c echo.Context) error {
return echo.NewHTTPError(http.StatusInternalServerError, "failed to get livecomments: "+err.Error())
}

livecomments := make([]Livecomment, len(livecommentModels))
for i := range livecommentModels {
livecomment, err := fillLivecommentResponse(ctx, tx, livecommentModels[i])
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "failed to fil livecomments: "+err.Error())
}
// livecomments := make([]Livecomment, len(livecommentModels))
// for i := range livecommentModels {
// livecomment, err := fillLivecommentResponse(ctx, tx, livecommentModels[i])
// if err != nil {
// return echo.NewHTTPError(http.StatusInternalServerError, "failed to fil livecomments: "+err.Error())
// }

livecomments[i] = livecomment
// livecomments[i] = livecomment
// }

livecomments, err := fillLivecommentResponses(ctx, tx, livecommentModels)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill livecomments: "+err.Error())
}

if err := tx.Commit(); err != nil {
Expand Down Expand Up @@ -422,6 +427,101 @@ func moderateHandler(c echo.Context) error {
})
}

func fillLivecommentResponses(ctx context.Context, tx *sqlx.Tx, livecommentModels []LivecommentModel) ([]Livecomment, error) {
if len(livecommentModels) == 0 {
return []Livecomment{}, nil
}

livecomments := make([]Livecomment, 0)

// populate users
users := make(map[int64]User)

userIDs := make([]int64, 0)
for i := range livecommentModels {
userIDs = append(userIDs, livecommentModels[i].UserID)
}

query := "SELECT * FROM users WHERE id IN (?)"
query, args, err := sqlx.In(query, userIDs)
if err != nil {
return []Livecomment{}, err
}

userModels := []UserModel{}
if err := tx.SelectContext(ctx, &userModels, query, args...); err != nil {
return []Livecomment{}, err
}

us, err := fillUserResponses(ctx, tx, userModels)
if err != nil {
return []Livecomment{}, err
}

for _, user := range us {
var livecommentModelID int64
for i := range livecommentModels {
if livecommentModels[i].UserID == user.ID {
livecommentModelID = livecommentModels[i].ID
break
}
}

users[livecommentModelID] = user
}

// populate livestreams
livestreams := make(map[int64]Livestream)

livestreamIDs := make([]int64, 0)
for i := range livecommentModels {
livestreamIDs = append(livestreamIDs, livecommentModels[i].LivestreamID)
}

query = "SELECT * FROM livestreams WHERE id IN (?)"
query, args, err = sqlx.In(query, livestreamIDs)
if err != nil {
return []Livecomment{}, err
}

livestreamModels := []LivestreamModel{}
if err := tx.SelectContext(ctx, &livestreamModels, query, args...); err != nil {
return []Livecomment{}, err
}

ls, err := fillLivestreamResponses(ctx, tx, livestreamModels)
if err != nil {
return []Livecomment{}, err
}

for _, livestream := range ls {
var livecommentModelID int64
for i := range livecommentModels {
if livecommentModels[i].LivestreamID == livestream.ID {
livecommentModelID = livecommentModels[i].ID
break
}
}

livestreams[livecommentModelID] = livestream
}

for _, livecommentModel := range livecommentModels {
livecomment := Livecomment{
ID: livecommentModel.ID,
User: users[livecommentModel.ID],
Livestream: livestreams[livecommentModel.ID],
Comment: livecommentModel.Comment,
Tip: livecommentModel.Tip,
CreatedAt: livecommentModel.CreatedAt,
}

livecomments = append(livecomments, livecomment)
}

return livecomments, nil
}

func fillLivecommentResponse(ctx context.Context, tx *sqlx.Tx, livecommentModel LivecommentModel) (Livecomment, error) {
commentOwnerModel := UserModel{}
if err := tx.GetContext(ctx, &commentOwnerModel, "SELECT * FROM users WHERE id = ?", livecommentModel.UserID); err != nil {
Expand Down
117 changes: 110 additions & 7 deletions webapp/go/reaction_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,19 @@ func getReactionsHandler(c echo.Context) error {
return echo.NewHTTPError(http.StatusNotFound, "failed to get reactions")
}

reactions := make([]Reaction, len(reactionModels))
for i := range reactionModels {
reaction, err := fillReactionResponse(ctx, tx, reactionModels[i])
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill reaction: "+err.Error())
}
// reactions := make([]Reaction, len(reactionModels))
// for i := range reactionModels {
// reaction, err := fillReactionResponse(ctx, tx, reactionModels[i])
// if err != nil {
// return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill reaction: "+err.Error())
// }

reactions[i] = reaction
// reactions[i] = reaction
// }

reactions, err := fillReactionResponses(ctx, tx, reactionModels)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill reactions: "+err.Error())
}

if err := tx.Commit(); err != nil {
Expand Down Expand Up @@ -141,6 +146,104 @@ func postReactionHandler(c echo.Context) error {
return c.JSON(http.StatusCreated, reaction)
}

func fillReactionResponses(ctx context.Context, tx *sqlx.Tx, reactionModels []ReactionModel) ([]Reaction, error) {
if len(reactionModels) == 0 {
return []Reaction{}, nil
}

reactions := make([]Reaction, len(reactionModels))

// populate users
users := make(map[int64]User)

userIDs := make([]int64, 0)
for i := range reactionModels {
userIDs = append(userIDs, reactionModels[i].UserID)
}

query := "SELECT * FROM users WHERE id IN (?)"
query, args, err := sqlx.In(query, userIDs)
if err != nil {
return []Reaction{}, err
}

// TODO: ユーザーの数とリアクションの数が一致しない場合は返したほうがいいかも

userModels := []UserModel{}
if err := tx.SelectContext(ctx, &userModels, query, args...); err != nil {
return []Reaction{}, err
}

us, err := fillUserResponses(ctx, tx, userModels)
if err != nil {
return []Reaction{}, err
}

for _, user := range us {
var reactionModelID int64
for i := range reactionModels {
if reactionModels[i].UserID == user.ID {
reactionModelID = reactionModels[i].ID
break
}
}

users[reactionModelID] = user
}

// populate liveStream
livestreams := make(map[int64]Livestream)

livestreamIDs := make([]int64, 0)
for i := range reactionModels {
livestreamIDs = append(livestreamIDs, reactionModels[i].LivestreamID)
}

query = "SELECT * FROM livestreams WHERE id IN (?)"
query, args, err = sqlx.In(query, livestreamIDs)
if err != nil {
return []Reaction{}, err
}

// TODO: ライブの数とリアクションの数が一致しない場合は返したほうがいいかも

livestreamModels := []LivestreamModel{}
if err := tx.SelectContext(ctx, &livestreamModels, query, args...); err != nil {
return []Reaction{}, err
}

ls, err := fillLivestreamResponses(ctx, tx, livestreamModels)
if err != nil {
return []Reaction{}, err
}

for _, livestream := range ls {
var reactionModelID int64
for i := range reactionModels {
if reactionModels[i].LivestreamID == livestream.ID {
reactionModelID = reactionModels[i].ID
break
}
}

livestreams[reactionModelID] = livestream
}

for _, reactionModel := range reactionModels {
reaction := Reaction{
ID: reactionModel.ID,
EmojiName: reactionModel.EmojiName,
User: users[reactionModel.ID],
Livestream: livestreams[reactionModel.ID],
CreatedAt: reactionModel.CreatedAt,
}

reactions = append(reactions, reaction)
}

return reactions, nil
}

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 {
Expand Down