Skip to content

Commit 65ebb24

Browse files
committed
create contest,question,testcase api added
1 parent d369c6f commit 65ebb24

File tree

7 files changed

+151
-4
lines changed

7 files changed

+151
-4
lines changed

cmd/portal-api/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
"github.com/krishkumar84/bdcoe-golang-portal/pkg/http/handler/users"
1818
"github.com/krishkumar84/bdcoe-golang-portal/pkg/middleware"
1919
"github.com/krishkumar84/bdcoe-golang-portal/pkg/storage/mongodb"
20+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/http/handler/contest"
21+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/http/handler/question"
22+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/http/handler/testcase"
2023
// "github.com/krishkumar84/bdcoe-golang-portal/pkg/http/handler/users"
2124
)
2225

@@ -67,6 +70,9 @@ router.Handle("GET /api/admin/test",
6770

6871
router.HandleFunc("POST /api/signup",users.New(storage))
6972
router.HandleFunc("POST /api/login",auth.Login(storage,cfg.JwtSecret))
73+
router.HandleFunc("POST /api/contest",contest.CreateContest(storage))
74+
router.HandleFunc("POST /api/question",question.CreateQuestion(storage))
75+
router.HandleFunc("POST /api/testcase",testcase.CreateTestCase(storage))
7076
// router.HandleFunc("GET /api/users/{id}",users.GetById(storage))
7177
// router.HandleFunc("GET /api/users",users.GetAll(storage))
7278

pkg/http/handler/contest/contest.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package contest
2+
3+
import (
4+
"net/http"
5+
"encoding/json"
6+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/storage"
7+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/types"
8+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/utils/response"
9+
)
10+
11+
func CreateContest(storage storage.Storage) http.HandlerFunc {
12+
return func(w http.ResponseWriter, r *http.Request) {
13+
var contestReq types.Contest
14+
if err := json.NewDecoder(r.Body).Decode(&contestReq); err != nil {
15+
response.WriteJson(w, http.StatusBadRequest, response.GeneralError(err))
16+
return
17+
}
18+
19+
contestId, err := storage.CreateContest(contestReq)
20+
if err != nil {
21+
response.WriteJson(w, http.StatusInternalServerError, response.GeneralError(err))
22+
return
23+
}
24+
25+
response.WriteJson(w, http.StatusCreated, map[string]string{"contest_id": contestId})
26+
}
27+
}

pkg/http/handler/question/question.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package question
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
7+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/storage"
8+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/types"
9+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/utils/response"
10+
)
11+
12+
func CreateQuestion(storage storage.Storage) http.HandlerFunc {
13+
return func(w http.ResponseWriter, r *http.Request) {
14+
var questionReq types.Question
15+
if err := json.NewDecoder(r.Body).Decode(&questionReq); err != nil {
16+
response.WriteJson(w, http.StatusBadRequest, response.GeneralError(err))
17+
return
18+
}
19+
20+
questionId, err := storage.CreateQuestion(questionReq)
21+
if err != nil {
22+
response.WriteJson(w, http.StatusInternalServerError, response.GeneralError(err))
23+
return
24+
}
25+
26+
response.WriteJson(w, http.StatusCreated, map[string]string{"question_id": questionId})
27+
}
28+
}

pkg/http/handler/testcase/testcase.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package testcase
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
7+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/storage"
8+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/types"
9+
"github.com/krishkumar84/bdcoe-golang-portal/pkg/utils/response"
10+
)
11+
12+
func CreateTestCase(storage storage.Storage) http.HandlerFunc {
13+
return func(w http.ResponseWriter, r *http.Request) {
14+
var testCaseReq types.TestCase
15+
if err := json.NewDecoder(r.Body).Decode(&testCaseReq); err != nil {
16+
response.WriteJson(w, http.StatusBadRequest, response.GeneralError(err))
17+
return
18+
}
19+
20+
testCaseId, err := storage.CreateTestCase(testCaseReq)
21+
if err != nil {
22+
response.WriteJson(w, http.StatusInternalServerError, response.GeneralError(err))
23+
return
24+
}
25+
26+
response.WriteJson(w, http.StatusCreated, map[string]string{"test_case_id": testCaseId})
27+
}
28+
}

pkg/storage/mongodb/mongodb.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"go.mongodb.org/mongo-driver/bson/primitive"
1212
"go.mongodb.org/mongo-driver/mongo"
1313
"go.mongodb.org/mongo-driver/mongo/options"
14+
"github.com/go-playground/validator/v10"
1415
)
1516

1617
type MongoDB struct {
@@ -94,4 +95,56 @@ func (m *MongoDB) GetUserByEmail(email string) (*types.User, error) {
9495
}
9596

9697
return &user, nil
98+
}
99+
100+
func (m *MongoDB) CreateContest(contest types.Contest) (string, error) {
101+
collection := m.db.Collection("contests")
102+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
103+
defer cancel()
104+
if err := validator.New().Struct(contest); err != nil {
105+
validateErrs := err.(validator.ValidationErrors)
106+
return "", fmt.Errorf("validation failed: %v", validateErrs)
107+
}
108+
result, err := collection.InsertOne(ctx, contest)
109+
if err != nil {
110+
return "", err
111+
}
112+
113+
return result.InsertedID.(primitive.ObjectID).Hex(), nil
114+
}
115+
116+
func (m *MongoDB) CreateQuestion(question types.Question) (string, error) {
117+
collection := m.db.Collection("questions")
118+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
119+
defer cancel()
120+
121+
if err := validator.New().Struct(question); err != nil {
122+
validateErrs := err.(validator.ValidationErrors)
123+
return "", fmt.Errorf("validation failed: %v", validateErrs)
124+
}
125+
126+
result, err := collection.InsertOne(ctx, question)
127+
if err != nil {
128+
return "", err
129+
}
130+
131+
return result.InsertedID.(primitive.ObjectID).Hex(), nil
132+
}
133+
134+
func (m *MongoDB) CreateTestCase(testCase types.TestCase) (string, error) {
135+
collection := m.db.Collection("test_cases")
136+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
137+
defer cancel()
138+
139+
if err := validator.New().Struct(testCase); err != nil {
140+
validateErrs := err.(validator.ValidationErrors)
141+
return "", fmt.Errorf("validation failed: %v", validateErrs)
142+
}
143+
144+
result, err := collection.InsertOne(ctx, testCase)
145+
if err != nil {
146+
return "", err
147+
}
148+
149+
return result.InsertedID.(primitive.ObjectID).Hex(), nil
97150
}

pkg/storage/storage.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,7 @@ type Storage interface {
88
// GetAllUsers()([]types.User, error)
99
CreateUser(name string, email string, password string, studentId string, role types.Role) (string, error)
1010
GetUserByEmail(email string) (*types.User, error)
11-
}
11+
CreateContest(contest types.Contest) (string, error)
12+
CreateQuestion(question types.Question) (string, error)
13+
CreateTestCase(testCase types.TestCase) (string, error)
14+
}

pkg/types/models.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ type User struct {
2222
}
2323

2424
type Contest struct {
25-
ID string `bson:"_id,omitempty" json:"contest_id" validate:"required"`
25+
ID string `bson:"_id,omitempty" json:"contest_id"`
2626
Title string `bson:"title" json:"title" validate:"required"`
2727
StartTime time.Time `bson:"start_time" json:"start_time" validate:"required"`
2828
EndTime time.Time `bson:"end_time" json:"end_time" validate:"required"`
29-
Questions []Question `bson:"questions" json:"questions" validate:"required"`
29+
Description string `bson:"description" json:"description" validate:"required"`
30+
CreatedBy primitive.ObjectID `bson:"created_by" json:"created_by"`
31+
QuestionIDs []string `bson:"question_ids" json:"question_ids" validate:"required"`
3032
CreatedAt time.Time `bson:"created_at" json:"created_at"`
3133
}
3234

@@ -36,7 +38,7 @@ type Question struct {
3638
Description string `bson:"description" json:"description" validate:"required"`
3739
Difficulty string `bson:"difficulty" json:"difficulty"`
3840
Tags []string `bson:"tags" json:"tags"`
39-
TestCases []TestCase `bson:"test_cases" json:"test_cases" validate:"required"`
41+
TestCaseIDs []string `bson:"test_case_ids" json:"test_case_ids" validate:"required"`
4042
Points int `bson:"points" json:"points"`
4143
Cpu_time_limit int `bson:"cpu_time_limit" json:"cpu_time_limit"`
4244
Memory_limit int `bson:"memory_limit" json:"memory_limit"`

0 commit comments

Comments
 (0)