Skip to content

Commit

Permalink
feat:update note (#226)
Browse files Browse the repository at this point in the history
* added updatenote

* added an update note api
  • Loading branch information
CommanderStorm authored Sep 14, 2023
1 parent ebd54f6 commit 505af6e
Show file tree
Hide file tree
Showing 7 changed files with 542 additions and 386 deletions.
784 changes: 398 additions & 386 deletions server/api/tumdev/campus_backend.pb.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions server/api/tumdev/campus_backend.proto
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,7 @@ message GetUpdateNoteRequest{

message GetUpdateNoteReply{
string message = 1;
string version_name = 2;
}

message GetStudyRoomListReply{
Expand Down
3 changes: 3 additions & 0 deletions server/api/tumdev/campus_backend.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -1734,6 +1734,9 @@
"properties": {
"message": {
"type": "string"
},
"versionName": {
"type": "string"
}
}
},
Expand Down
1 change: 1 addition & 0 deletions server/api/tumdev/campus_backend_grpc.pb.go

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

96 changes: 96 additions & 0 deletions server/backend/updateNews_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package backend

import (
"context"
"database/sql"
"regexp"
"testing"

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

"github.com/DATA-DOG/go-sqlmock"
pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"google.golang.org/grpc/metadata"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

type UpdateNoteSuite struct {
suite.Suite
DB *gorm.DB
mock sqlmock.Sqlmock
deviceBuf *deviceBuffer
}

func (s *UpdateNoteSuite) SetupSuite() {
var (
db *sql.DB
err error
)

db, s.mock, err = sqlmock.New()
require.NoError(s.T(), err)

dialector := mysql.New(mysql.Config{
Conn: db,
DriverName: "mysql",
})
s.mock.ExpectQuery("SELECT VERSION()").
WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB"))
s.DB, err = gorm.Open(dialector, &gorm.Config{})
require.NoError(s.T(), err)

s.deviceBuf = newDeviceBuffer()
}

const ExpectedGetUpdateNoteQuery = "SELECT * FROM `update_note` WHERE `update_note`.`version_code` = ? ORDER BY `update_note`.`version_code` LIMIT 1"

func (s *UpdateNoteSuite) Test_GetUpdateNoteOne() {
s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)).
WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"}).
AddRow(1, "1.0.0", "Test Message"))

meta := metadata.MD{}
server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf}
response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1})
require.NoError(s.T(), err)
expectedResp := &pb.GetUpdateNoteReply{
Message: "Test Message",
VersionName: "1.0.0",
}
require.Equal(s.T(), expectedResp, response)
}

func (s *UpdateNoteSuite) Test_GetUpdateNoteNone() {
s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)).
WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"}))

meta := metadata.MD{}
server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf}
response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1})
require.Equal(s.T(), status.Error(codes.NotFound, "No update note found"), err)
require.Nil(s.T(), response)
}

func (s *UpdateNoteSuite) Test_GetUpdateNoteError() {
s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)).WillReturnError(gorm.ErrInvalidDB)

meta := metadata.MD{}
server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf}
response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1})
require.Equal(s.T(), status.Error(codes.Internal, "Internal server error"), err)
require.Nil(s.T(), response)
}

func (s *UpdateNoteSuite) AfterTest(_, _ string) {
require.NoError(s.T(), s.mock.ExpectationsWereMet())
}

// In order for 'go test' to run this suite, we need to create
// a normal test function and pass our suite to suite.Run
func TestUpdateNoteSuite(t *testing.T) {
suite.Run(t, new(UpdateNoteSuite))
}
30 changes: 30 additions & 0 deletions server/backend/updateNote.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package backend

import (
"context"
"errors"

"google.golang.org/grpc/codes"

pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev"
"github.com/TUM-Dev/Campus-Backend/server/model"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc/status"
"gorm.io/gorm"
)

func (s *CampusServer) GetUpdateNote(ctx context.Context, req *pb.GetUpdateNoteRequest) (*pb.GetUpdateNoteReply, error) {
if err := s.checkDevice(ctx); err != nil {
return nil, err
}

res := model.UpdateNote{VersionCode: req.Version}
if err := s.db.First(&res).Error; errors.Is(err, gorm.ErrRecordNotFound) {
return nil, status.Error(codes.NotFound, "No update note found")
} else if err != nil {
log.WithField("VersionCode", req.Version).WithError(err).Error("Failed to get update note")
return nil, status.Error(codes.Internal, "Internal server error")
}

return &pb.GetUpdateNoteReply{Message: res.Message, VersionName: res.VersionName}, nil
}
13 changes: 13 additions & 0 deletions server/model/updateNote.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package model

// UpdateNote struct for update notes
type UpdateNote struct {
VersionCode int32 `gorm:"primary_key;AUTO_INCREMENT;column:version_code;type:int;"`
VersionName string `gorm:"column:version_name;type:text;"`
Message string `gorm:"column:message;type:text;"`
}

// TableName sets the insert table name for this struct type
func (n *UpdateNote) TableName() string {
return "update_note"
}

0 comments on commit 505af6e

Please sign in to comment.