Skip to content

Commit

Permalink
feat: cache in academic scores
Browse files Browse the repository at this point in the history
  • Loading branch information
jiuxia211 committed Feb 8, 2025
1 parent 435223f commit 92c3b86
Show file tree
Hide file tree
Showing 21 changed files with 179 additions and 34 deletions.
2 changes: 2 additions & 0 deletions api/model/api/api.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions api/model/model/model.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions api/router/api/api.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 8 additions & 3 deletions cmd/academic/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,23 @@ import (
"github.com/west2-online/fzuhelper-server/config"
"github.com/west2-online/fzuhelper-server/internal/academic"
"github.com/west2-online/fzuhelper-server/kitex_gen/academic/academicservice"
"github.com/west2-online/fzuhelper-server/pkg/base"
"github.com/west2-online/fzuhelper-server/pkg/constants"
"github.com/west2-online/fzuhelper-server/pkg/logger"
"github.com/west2-online/fzuhelper-server/pkg/utils"
)

var serviceName = constants.AcademicServiceName
var (
serviceName = constants.AcademicServiceName
clientSet *base.ClientSet
)

func init() {
config.Init(serviceName)
logger.Init(serviceName, config.GetLoggerLevel())
// eshook.InitLoggerWithHook(serviceName)
// dal.Init() // TODO 增加成绩信息持久化开始推送
clientSet = base.NewClientSet(base.WithRedisClient(constants.RedisDBAcademic))
// TODO 增加成绩信息持久化开始推送
}

func main() {
Expand All @@ -56,7 +61,7 @@ func main() {
}

svr := academicservice.NewServer(
new(academic.AcademicServiceImpl),
academic.NewAcademicService(clientSet),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{
ServiceName: serviceName,
}),
Expand Down
34 changes: 19 additions & 15 deletions internal/academic/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,22 @@ import (
)

// AcademicServiceImpl implements the last service interface defined in the IDL.
type AcademicServiceImpl struct{}
type AcademicServiceImpl struct {
ClientSet *base.ClientSet
}

func NewAcademicService(clientSet *base.ClientSet) *AcademicServiceImpl {
return &AcademicServiceImpl{
ClientSet: clientSet,
}
}

// GetScores implements the AcademicServiceImpl interface.
func (s *AcademicServiceImpl) GetScores(ctx context.Context, req *academic.GetScoresRequest) (resp *academic.GetScoresResponse, err error) {
func (s *AcademicServiceImpl) GetScores(ctx context.Context, _ *academic.GetScoresRequest) (resp *academic.GetScoresResponse, err error) {
resp = academic.NewGetScoresResponse()
var scores []*jwch.Mark
l := service.NewAcademicService(ctx)

scores, err = l.GetScores()
scores, err = service.NewAcademicService(ctx, s.ClientSet).GetScores()
if err != nil {
logger.Infof("Academic.GetScores: GetScores failed, err: %v", err)
resp.Base = base.BuildBaseResp(err)
Expand All @@ -49,12 +56,11 @@ func (s *AcademicServiceImpl) GetScores(ctx context.Context, req *academic.GetSc
}

// GetGPA implements the AcademicServiceImpl interface.
func (s *AcademicServiceImpl) GetGPA(ctx context.Context, req *academic.GetGPARequest) (resp *academic.GetGPAResponse, err error) {
func (s *AcademicServiceImpl) GetGPA(ctx context.Context, _ *academic.GetGPARequest) (resp *academic.GetGPAResponse, err error) {
resp = academic.NewGetGPAResponse()
var gpa *jwch.GPABean
l := service.NewAcademicService(ctx)

gpa, err = l.GetGPA()
gpa, err = service.NewAcademicService(ctx, s.ClientSet).GetGPA()
if err != nil {
logger.Infof("Academic.GetGPA: GetGPA failed, err: %v", err)
resp.Base = base.BuildBaseResp(err)
Expand All @@ -66,12 +72,11 @@ func (s *AcademicServiceImpl) GetGPA(ctx context.Context, req *academic.GetGPARe
}

// GetCredit implements the AcademicServiceImpl interface.
func (s *AcademicServiceImpl) GetCredit(ctx context.Context, req *academic.GetCreditRequest) (resp *academic.GetCreditResponse, err error) {
func (s *AcademicServiceImpl) GetCredit(ctx context.Context, _ *academic.GetCreditRequest) (resp *academic.GetCreditResponse, err error) {
resp = academic.NewGetCreditResponse()
var credit []*jwch.CreditStatistics
l := service.NewAcademicService(ctx)

credit, err = l.GetCredit()
credit, err = service.NewAcademicService(ctx, s.ClientSet).GetCredit()
if err != nil {
logger.Infof("Academic.GetCredit: GetCredit failed, err: %v", err)
resp.Base = base.BuildBaseResp(err)
Expand All @@ -84,12 +89,11 @@ func (s *AcademicServiceImpl) GetCredit(ctx context.Context, req *academic.GetCr
}

// GetUnifiedExam implements the AcademicServiceImpl interface.
func (s *AcademicServiceImpl) GetUnifiedExam(ctx context.Context, req *academic.GetUnifiedExamRequest) (resp *academic.GetUnifiedExamResponse, err error) {
func (s *AcademicServiceImpl) GetUnifiedExam(ctx context.Context, _ *academic.GetUnifiedExamRequest) (resp *academic.GetUnifiedExamResponse, err error) {
resp = academic.NewGetUnifiedExamResponse()
var unifiedExam []*jwch.UnifiedExam
l := service.NewAcademicService(ctx)

unifiedExam, err = l.GetUnifiedExam()
unifiedExam, err = service.NewAcademicService(ctx, s.ClientSet).GetUnifiedExam()
if err != nil {
logger.Infof("Academic.GetUnifiedExam: GetUnifiedExam failed, err: %v", err)
resp.Base = base.BuildBaseResp(err)
Expand All @@ -102,9 +106,9 @@ func (s *AcademicServiceImpl) GetUnifiedExam(ctx context.Context, req *academic.
}

// GetPlan implements the AcademicServiceImpl interface.
func (s *AcademicServiceImpl) GetPlan(ctx context.Context, req *academic.GetPlanRequest) (resp *academic.GetPlanResponse, err error) {
func (s *AcademicServiceImpl) GetPlan(ctx context.Context, _ *academic.GetPlanRequest) (resp *academic.GetPlanResponse, err error) {
resp = new(academic.GetPlanResponse)
plan, err := service.NewAcademicService(ctx).GetPlan()
plan, err := service.NewAcademicService(ctx, s.ClientSet).GetPlan()
if err != nil {
resp.Base = base.BuildBaseResp(err)
return resp, nil
Expand Down
2 changes: 1 addition & 1 deletion internal/academic/service/get_credit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func TestAcademicService_GetCredit(t *testing.T) {
Cookies: "",
}, nil
}).Build()
academicService := NewAcademicService(context.Background())
academicService := AcademicService{}
result, err := academicService.GetCredit()
if tc.expectingError {
assert.Nil(t, result)
Expand Down
2 changes: 1 addition & 1 deletion internal/academic/service/get_gpa_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func TestAcademicService_GetGPA(t *testing.T) {
Cookies: "",
}, nil
}).Build()
academicService := NewAcademicService(context.Background())
academicService := AcademicService{}
result, err := academicService.GetGPA()
if tc.expectingError {
assert.Nil(t, result)
Expand Down
23 changes: 16 additions & 7 deletions internal/academic/service/get_scores.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package service

import (
"fmt"

Check failure on line 20 in internal/academic/service/get_scores.go

View workflow job for this annotation

GitHub Actions / lint

File is not properly formatted (gci)

"github.com/west2-online/fzuhelper-server/pkg/base"
"github.com/west2-online/fzuhelper-server/pkg/base/context"
"github.com/west2-online/fzuhelper-server/pkg/utils"
Expand All @@ -30,11 +29,21 @@ func (s *AcademicService) GetScores() ([]*jwch.Mark, error) {
if err != nil {
return nil, fmt.Errorf("service.GetScores: Get login data fail %w", err)
}
stu := jwch.NewStudent().WithLoginData(loginData.Id, utils.ParseCookies(loginData.Cookies))
scores, err := stu.GetMarks()
if err = base.HandleJwchError(err); err != nil {
return nil, fmt.Errorf("service.GetScores: Get scores info fail %w", err)
}

return scores, nil
key := fmt.Sprintf("scores:%s", loginData.Id)
if ok := s.cache.IsKeyExist(s.ctx, key); ok {
scores, err := s.cache.Academic.GetScoresCache(s.ctx, key)
if err = base.HandleJwchError(err); err != nil {
return nil, fmt.Errorf("service.GetScores: Get scores info from redis error %w", err)
}
return scores, nil
} else {
stu := jwch.NewStudent().WithLoginData(loginData.Id, utils.ParseCookies(loginData.Cookies))
scores, err := stu.GetMarks()
if err = base.HandleJwchError(err); err != nil {
return nil, fmt.Errorf("service.GetScores: Get scores info fail %w", err)
}
go s.cache.Academic.SetScoresCache(s.ctx, key, scores)
return scores, nil
}
}
2 changes: 1 addition & 1 deletion internal/academic/service/get_scores_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func TestAcademicService_GetScores(t *testing.T) {
Cookies: "",
}, nil
}).Build()
academicService := NewAcademicService(context.Background())
academicService := AcademicService{}
result, err := academicService.GetScores()
if tc.expectingError {
assert.Nil(t, result)
Expand Down
2 changes: 1 addition & 1 deletion internal/academic/service/get_unified_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func TestAcademicService_GetUnifiedExam(t *testing.T) {
Cookies: "",
}, nil
}).Build()
academicService := NewAcademicService(context.Background())
academicService := AcademicService{}
result, err := academicService.GetUnifiedExam()
if tc.expectingError {
assert.Nil(t, result)
Expand Down
11 changes: 8 additions & 3 deletions internal/academic/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,19 @@ package service

import (
"context"

"github.com/west2-online/fzuhelper-server/pkg/base"
"github.com/west2-online/fzuhelper-server/pkg/cache"
)

type AcademicService struct {
ctx context.Context
ctx context.Context
cache *cache.Cache
}

func NewAcademicService(ctx context.Context) *AcademicService {
func NewAcademicService(ctx context.Context, clientset *base.ClientSet) *AcademicService {
return &AcademicService{
ctx: ctx,
ctx: ctx,
cache: clientset.CacheClient,
}
}
3 changes: 2 additions & 1 deletion kitex_gen/model/model.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion kitex_gen/paper/paper.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions kitex_gen/paper/paperservice/client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions kitex_gen/paper/paperservice/paperservice.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions kitex_gen/paper/paperservice/server.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 29 additions & 0 deletions pkg/cache/academic/academic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
Copyright 2024 The west2-online Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package academic

import "github.com/redis/go-redis/v9"

type CacheAcademic struct {
client *redis.Client
}

func NewCacheAcademic(client *redis.Client) *CacheAcademic {
return &CacheAcademic{
client: client,
}
}
38 changes: 38 additions & 0 deletions pkg/cache/academic/get_scores.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
Copyright 2024 The west2-online Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package academic

import (
"context"

"github.com/bytedance/sonic"

"github.com/west2-online/fzuhelper-server/pkg/errno"
"github.com/west2-online/jwch"
)

func (c *CacheAcademic) GetScoresCache(ctx context.Context, key string) (scores []*jwch.Mark, err error) {
data, err := c.client.Get(ctx, key).Bytes()
if err != nil {
return nil, errno.Errorf(errno.InternalJSONErrorCode, "dal.GetScoresCache: Get scores info failed: %v", err)
}
err = sonic.Unmarshal(data, &scores)
if err != nil {
return nil, errno.Errorf(errno.InternalJSONErrorCode, "dal.GetScoresCache: Unmarshal scores info failed: %v", err)
}
return scores, nil
}
Loading

0 comments on commit 92c3b86

Please sign in to comment.