diff --git a/memo b/memo new file mode 100644 index 0000000..9116956 --- /dev/null +++ b/memo @@ -0,0 +1,122 @@ +package main + +import ( + "fmt" + "os" + "io" + "time" + "database/sql" + "godotenv" + "github.com/labstack/echo" + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/mysql" +) + + + +//task +//問題を管理するデータベースを作る +//追加・更新・取得APIを作る +//Code Tips Language +//ワンライナー DBに入れてデータを取得 +//DBで登録しているものを渡す・問題の受け渡し + + + +type Question struct { + gorm.Model + Id string + Code string + Tips string + Language string +} + + +func (u Question) String() string { + return fmt.Sprintf("Id:%s \n Code:%s \n Tips:%d \n Language:%d \n", + u.Id, + u.Code, + u.Tips, + u.Language, + ) +} + +// ユーザーを登録 +func BaseAPI_user() echo.HandlerFunc { + return func(c echo.Context) error { + db := databases.Connect() + defer db.Close() + + //リクエストボディ + user := new(Question) + + user1 := Question{ + Id: user.Id, + Code: user.Code, + Tips: user.Tips, + Language: user.Language, + } + + //追加 + insertUsers := []Question{user1} + insert(insertUsers, db) + + //更新 + update(user1, db) + + //取得 + + + return c.JSON() + } +} + +func insert(users []Question, db *gorm.DB) { + for _, user := range users { + db.NewRecord(user) + db.Create(&user) + } +} + +func update(users Question, db *gorm.DB) { + var user Question + db.Model(&user).Where("id = ?", 1).Update(map[string]interface{}{"Id": users.Id, "Code": users.Code, "Tips": users.Tips, "Language": users.Language}) +} + + + +func search(age int, db *gorm.DB) ([]Question) { + var user []Question + db.Raw("SELECT * FROM users WHERE code = ? ", age).Scan(&user) + + return user +} + + +// SQLConnect DB接続 + +func GormConnect() (database *gorm.DB) { + // パスワード等を.envファイルから読み取る + // program > go > .env + err := godotenv.Load(fmt.Sprintf("../%s.env", os.Getenv("GO_ENV"))) + if err != nil { + panic(err.Error()) + } else { + fmt.Println("ok") + } + + DBMS := "mysql" // MySQL + PROTOCOL := "tcp(localhost:3306)" // db:3306 + DBNAME := "" // テーブル名 + USER := "" // MySQLユーザー名 + PASS := "" // パスワード + + CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo" + db, err := gorm.Open(DBMS, CONNECT) + if err != nil { + panic(err.Error()) + } else { + fmt.Println("DB接続成功") + } + return db +} diff --git a/server/database/mysql/1_create_room.sql b/server/database/mysql/1_create_room.sql new file mode 100644 index 0000000..b7f4b40 --- /dev/null +++ b/server/database/mysql/1_create_room.sql @@ -0,0 +1,6 @@ +CREATE TABLE `rooms` ( + `room_id` varchar(255) COLLATE utf8mb4_bin NOT NULL, + `room_name` varchar(255) COLLATE utf8mb4_bin NOT NULL, + `max_count` int COLLATE utf8mb4_bin NOT NULL, + PRIMARY KEY (room_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; \ No newline at end of file diff --git a/server/database/mysql/2_insert_data.sql b/server/database/mysql/2_insert_data.sql new file mode 100644 index 0000000..e07df16 --- /dev/null +++ b/server/database/mysql/2_insert_data.sql @@ -0,0 +1,3 @@ +INSERT INTO rooms (`room_id`, `room_name`,`max_count`) VALUES ("c1", "n1", 1); +INSERT INTO rooms (`room_id`, `room_name`,`max_count`) VALUES ("c2", "n2", 2); +INSERT INTO rooms (`room_id`, `room_name`,`max_count`) VALUES ("c3", "n3", 3); \ No newline at end of file diff --git a/server/database/mysql/3_create_member_table.sql b/server/database/mysql/3_create_member_table.sql new file mode 100644 index 0000000..e6a569c --- /dev/null +++ b/server/database/mysql/3_create_member_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE `members` ( + `user_id` varchar(255) COLLATE utf8mb4_bin NOT NULL, + `user_name` varchar(255) COLLATE utf8mb4_bin NOT NULL, + `room_id` varchar(255) COLLATE utf8mb4_bin NOT NULL, + FOREIGN KEY (room_id) REFERENCES rooms(room_id) ON DELETE CASCADE, + PRIMARY KEY (user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; \ No newline at end of file diff --git a/server/database/mysql/4_insert_member_data.sql b/server/database/mysql/4_insert_member_data.sql new file mode 100644 index 0000000..6381848 --- /dev/null +++ b/server/database/mysql/4_insert_member_data.sql @@ -0,0 +1,3 @@ +INSERT INTO members (`user_id`,`user_name`,`room_id`) VALUES ("c1", "testname1", "c1"); +INSERT INTO members (`user_id`,`user_name`,`room_id`) VALUES ("c2", "testname2", "c2"); +INSERT INTO members (`user_id`,`user_name`,`room_id`) VALUES ("c3", "testname3", "c3"); diff --git a/server/src/config/dsn.go b/server/src/config/dsn.go new file mode 100644 index 0000000..fee79bc --- /dev/null +++ b/server/src/config/dsn.go @@ -0,0 +1,32 @@ +package config + +import ( + "fmt" + "os" +) + +// DSNはdataSourceNameを返します、もし必須の環境変数が設定されてなかった場合はerrorを返す +func DSN() (string, error) { + if os.Getenv("ENVIROMENT") == "PRODUCTION" { + return os.Getenv("POSTGRES_URL"), nil + } + + // DBの環境変数 + dbHost := os.Getenv("POSTGRES_HOST") + dbPort := os.Getenv("POSTGRES_PORT") + dbUser := os.Getenv("POSTGRES_USER") + dbPassword := os.Getenv("POSTGRES_PASSWORD") + dbName := os.Getenv("POSTGRES_DB") + + if dbUser == "" || dbPassword == "" || dbHost == "" || dbPort == "" || dbName == "" { + return "", fmt.Errorf("ERROR : required environment variable not found") + } + return fmt.Sprintf( + "user=%s password=%s host=%s port=%s dbname=%s sslmode=disable", + dbUser, + dbPassword, + dbHost, + dbPort, + dbName, + ), nil +} \ No newline at end of file diff --git a/server/src/config/port.go b/server/src/config/port.go new file mode 100644 index 0000000..2d9731c --- /dev/null +++ b/server/src/config/port.go @@ -0,0 +1,7 @@ +package config + +import "github.com/Doer-org/hack-camp_vol9_2022-2/utils" + +func Port() string { + return utils.GetEnvOrDefault("PORT", "8080") +} \ No newline at end of file diff --git a/server/src/domain/entity/member.go b/server/src/domain/entity/member.go new file mode 100644 index 0000000..865e1c6 --- /dev/null +++ b/server/src/domain/entity/member.go @@ -0,0 +1,9 @@ +package entity + +type Member struct { + UserId string + UserName string + RoomId string +} + +type Members []*Member \ No newline at end of file diff --git a/server/src/domain/entity/question.go b/server/src/domain/entity/question.go new file mode 100644 index 0000000..d81c793 --- /dev/null +++ b/server/src/domain/entity/question.go @@ -0,0 +1,8 @@ +package entity + +type Question struct { + Id string + Code string + Tips string + Language string +} diff --git a/server/src/domain/entity/room.go b/server/src/domain/entity/room.go new file mode 100644 index 0000000..dad8fcb --- /dev/null +++ b/server/src/domain/entity/room.go @@ -0,0 +1,7 @@ +package entity + +type Room struct { + RoomId string + RoomName string + MaxCount int +} \ No newline at end of file diff --git a/server/src/domain/repository/member.go b/server/src/domain/repository/member.go new file mode 100644 index 0000000..da5e47c --- /dev/null +++ b/server/src/domain/repository/member.go @@ -0,0 +1,9 @@ +package repository + +import "github.com/Doer-org/hack-camp_vol9_2022-2/domain/entity" + +type IMemberRepository interface { + CreateMember(userId string, userName string, roomId string) (*entity.Member, error) + GetAllMembersOfRoomID(roomId string) (entity.Members, error) + DeleteAllMembersOfRoomID(roomId string) error +} \ No newline at end of file diff --git a/server/src/domain/repository/quesiton.go b/server/src/domain/repository/quesiton.go new file mode 100644 index 0000000..85ca89a --- /dev/null +++ b/server/src/domain/repository/quesiton.go @@ -0,0 +1,10 @@ +package repository + +import "github.com/Doer-org/hack-camp_vol9_2022-2/domain/entity" + +type QuestionRepository interface { + CreateQuestion(id string, code string, tips int, language int) (*entity.Question, error) + GetQuestionOfID(id string) (*entity.Question, error) + DeleteAllQuestion() error + DeleteQuestionOfID(id string) error +} \ No newline at end of file diff --git a/server/src/domain/repository/room.go b/server/src/domain/repository/room.go new file mode 100644 index 0000000..21485ff --- /dev/null +++ b/server/src/domain/repository/room.go @@ -0,0 +1,10 @@ +package repository + +import "github.com/Doer-org/hack-camp_vol9_2022-2/domain/entity" + +type IRoomRepository interface { + NewRoom(id string, name string, max_member int, member_count int) (*entity.Room, error) + GetRoomOfID(id string) (*entity.Room, error) + DeleteAllRoom() error + DeleteRoomOfID(id string) error +} \ No newline at end of file diff --git a/server/src/error/.DS_Store b/server/src/error/.DS_Store new file mode 100644 index 0000000..9af1f37 Binary files /dev/null and b/server/src/error/.DS_Store differ diff --git a/server/src/error/infrastructure/error.go b/server/src/error/infrastructure/error.go new file mode 100644 index 0000000..5c8a653 --- /dev/null +++ b/server/src/error/infrastructure/error.go @@ -0,0 +1,12 @@ +package infrastructure + +import "errors" + +var ( + + //roomのエラー + StatementError = errors.New("statement error") + ExecError = errors.New("exec error") + QueryrowError = errors.New("queryrow error") + RowsScanError = errors.New("Rows Scan error") +) \ No newline at end of file diff --git a/server/src/error/presentation/error.go b/server/src/error/presentation/error.go new file mode 100644 index 0000000..9060fed --- /dev/null +++ b/server/src/error/presentation/error.go @@ -0,0 +1 @@ +package presentation \ No newline at end of file diff --git a/server/src/error/usecase/error.go b/server/src/error/usecase/error.go new file mode 100644 index 0000000..a4cbb32 --- /dev/null +++ b/server/src/error/usecase/error.go @@ -0,0 +1,19 @@ +package usecase + +import "errors" + +var ( + + //roomのエラー + IdEmptyError = errors.New("room id empty") + NameEmptyError = errors.New("name empty") + MaxCountError = errors.New("max count failed") + RoomdIdUsedError = errors.New("room id already used") + RoomdIdEmptyError = errors.New("room id empty") + + //chatのエラー + MessageEmptyError = errors.New("message empty") + SizeEmptyError = errors.New("size empty") + RoomIdEmptyError = errors.New("room id empty") + MemberIdEmptyError = errors.New("room id already used") +) \ No newline at end of file diff --git a/server/src/infrastructure/.DS_Store b/server/src/infrastructure/.DS_Store new file mode 100644 index 0000000..2aa67f3 Binary files /dev/null and b/server/src/infrastructure/.DS_Store differ diff --git a/server/src/infrastructure/databese/database.go b/server/src/infrastructure/databese/database.go new file mode 100644 index 0000000..c5eb58d --- /dev/null +++ b/server/src/infrastructure/databese/database.go @@ -0,0 +1,33 @@ +package database + +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/go-sql-driver/mysql" + + "github.com/Doer-org/hack-camp_vol9_2022-2/config" +) + +func NewDB() (*sql.DB, error) { + dbDSN, err := config.DSN() + if err != nil { + return nil, err + } + db, err := sql.Open("mysql", dbDSN) + if err != nil { + return nil, fmt.Errorf("failed to open MySQL : %w", err) + } + + err = db.Ping() + + if err != nil { + log.Println("DB接続失敗") + panic(err) + } else { + log.Println("DB接続成功") + } + + return db, err +} diff --git a/server/src/infrastructure/persistence/question.go b/server/src/infrastructure/persistence/question.go new file mode 100644 index 0000000..5ec86af --- /dev/null +++ b/server/src/infrastructure/persistence/question.go @@ -0,0 +1,89 @@ +package persistance + +import ( + "database/sql" + "log" + + "github.com/Doer-org/hack-camp_vol9_2022-1/domain/entity" + "github.com/Doer-org/hack-camp_vol9_2022-1/domain/repository" + db_error "github.com/Doer-org/hack-camp_vol9_2022-1/error/infrastructure" +) + +var _ repository.QuestionRepository = &QuestionRepository{} + +type QuestionRepository struct { + db *sql.DB +} + +func NewQuestionRepository(db *sql.DB) *QuestionRepository { + return &QuestionRepository{ + db: db, + } +} + +func (repo *QuestionRepository) NewQuestion(id string, code string, tips string, language string) (*entity.Question, error) { + statement := "INSERT INTO questions VALUES(?,?,?,?)" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return nil, db_error.StatementError + } + defer stmt.Close() + + question := &entity.Question{} + _, err = stmt.Exec(id, code, tips, language) + + question.Id = id + question.Code = code + question.Tips = tips + question.Language = language + + + if err != nil { + log.Println(err) + return nil, db_error.ExecError + } + + return question, nil +} +func (repo *QuestionRepository) GetQuestionOfID(id string) (*entity.Question, error) { + statement := "SELECT * FROM questions WHERE id = ?" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return nil, db_error.StatementError + } + defer stmt.Close() + + question := &entity.Question{} + err = stmt.QueryRow(id).Scan(&question.Id, &question.Code, &question.Tips, &question.Language) + + if err != nil && err != sql.ErrNoRows { + log.Println(err) + return nil, db_error.QueryrowError + } + + return question, nil +} + +func (repo *QuestionRepository) DeleteAllQuestion() error { + statement := "DELETE FROM questions" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return db_error.StatementError + } + defer stmt.Close() + + _, err = stmt.Exec() + + if err != nil { + log.Println(err) + return db_error.ExecError + } + + return nil +} \ No newline at end of file diff --git a/server/src/infrastructure/persistence/room.go b/server/src/infrastructure/persistence/room.go new file mode 100644 index 0000000..4326db7 --- /dev/null +++ b/server/src/infrastructure/persistence/room.go @@ -0,0 +1,87 @@ +package persistance + +import ( + "database/sql" + "log" + + "github.com/Doer-org/hack-camp_vol9_2022-1/domain/entity" + "github.com/Doer-org/hack-camp_vol9_2022-1/domain/repository" + db_error "github.com/Doer-org/hack-camp_vol9_2022-1/error/infrastructure" +) + +var _ repository.IRoomRepository = &RoomRepository{} + +type RoomRepository struct { + db *sql.DB +} + +func NewRoomRepository(db *sql.DB) *RoomRepository { + return &RoomRepository{ + db: db, + } +} + +func (repo *RoomRepository) NewRoom(id string, name string) (*entity.Room, error) { + statement := "INSERT INTO rooms VALUES(?,?,?,?)" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return nil, db_error.StatementError + } + defer stmt.Close() + + room := &entity.Room{} + _, err = stmt.Exec(id, name) + + room.Id = id + room.Name = name + + if err != nil { + log.Println(err) + return nil, db_error.ExecError + } + + return room, nil +} +func (repo *RoomRepository) GetRoomOfID(id string) (*entity.Room, error) { + statement := "SELECT * FROM rooms WHERE id = ?" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return nil, db_error.StatementError + } + defer stmt.Close() + + room := &entity.Room{} + err = stmt.QueryRow(id).Scan(&room.Id, &room.Name) + + if err != nil && err != sql.ErrNoRows { + log.Println(err) + return nil, db_error.QueryrowError + } + + return room, nil +} + +func (repo *RoomRepository) DeleteAllRoom() error { + statement := "DELETE FROM rooms" + + stmt, err := repo.db.Prepare(statement) + if err != nil { + log.Println(err) + return db_error.StatementError + } + defer stmt.Close() + + _, err = stmt.Exec() + + if err != nil { + log.Println(err) + return db_error.ExecError + } + + return nil +} + diff --git a/server/src/presentation/handler/member.go b/server/src/presentation/handler/member.go new file mode 100644 index 0000000..1b8123c --- /dev/null +++ b/server/src/presentation/handler/member.go @@ -0,0 +1,86 @@ +package handler + +import ( + "net/http" + + "github.com/Doer-org/hack-camp_vol9_2022-2/presentation/json" + "github.com/Doer-org/hack-camp_vol9_2022-2/usecase" + "github.com/gin-gonic/gin" +) + +type MemberHandler struct { + uc usecase.IMemberUsecase +} + +func NewMemberHandler(uc usecase.IMemberUsecase) *MemberHandler { + return &MemberHandler{ + uc: uc, + } +} + +func (rh *MemberHandler) CreateMember(ctx *gin.Context) { + var memberjson json.MemberJson + if err := ctx.BindJSON(&memberjson); err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + member := json.MemberJsonToEntity(&memberjson) + member, err := rh.uc.CreateMember(member.UserId, member.UserName, member.RoomId) + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + memberJson := json.MemberEntityToJson(member) + ctx.JSON( + http.StatusOK, + gin.H{"data": memberJson}, + ) + +} + +func (rh *MemberHandler) GetAllMembersOfRoomID(ctx *gin.Context) { + roomId := ctx.Param("roomId") + member, err := rh.uc.GetAllMembersOfRoomID(roomId) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + memberJson := json.MembersEntityToJson(member) + ctx.JSON( + http.StatusOK, + gin.H{"data": memberJson}, + ) + +} + +func (rh *MemberHandler) DeleteAllMembersOfRoomID(ctx *gin.Context) { + roomId := ctx.Param("roomId") + err := rh.uc.DeleteAllMembersOfRoomID(roomId) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + ctx.JSON( + http.StatusOK, + gin.H{"data": "success"}, + ) + +} \ No newline at end of file diff --git a/server/src/presentation/handler/question.go b/server/src/presentation/handler/question.go new file mode 100644 index 0000000..913b651 --- /dev/null +++ b/server/src/presentation/handler/question.go @@ -0,0 +1,86 @@ +package handler + +import ( + "net/http" + + "github.com/Doer-org/hack-camp_vol9_2022-2/presentation/json" + "github.com/Doer-org/hack-camp_vol9_2022-2/usecase" + "github.com/gin-gonic/gin" +) + +type QuestionHandler struct { + uc usecase.IQuestionUsecase +} + +func NewQuestionHandler(uc usecase.IQuestionUsecase) *QuestionHandler { + return &QuestionHandler{ + uc: uc, + } +} + +func (rh *QuestionHandler) CreateQuestion(ctx *gin.Context) { + var questionjson json.questionJson + if err := ctx.BindJSON(&questionjson); err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + question := json.QuestionJsonToEntity(&questionjson) + question, err := rh.uc.CreateQuestion(question.Id, question.Code, question.Tips, question.Language) + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + questionJson := json.QuestionEntityToJson(question) + ctx.JSON( + http.StatusOK, + gin.H{"data": questionJson}, + ) + +} + +func (rh *QuestionHandler) GetAllMembersOfRoomID(ctx *gin.Context) { + roomId := ctx.Param("roomId") + member, err := rh.uc.GetAllMembersOfRoomID(roomId) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + memberJson := json.QuestionEntityToJson(member) + ctx.JSON( + http.StatusOK, + gin.H{"data": memberJson}, + ) + +} + +func (rh *QuestionHandler) DeleteAllQuestionOfRoomID(ctx *gin.Context) { + roomId := ctx.Param("roomId") + err := rh.uc.DeleteAllQuestionOfRoomID(roomId) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + ctx.JSON( + http.StatusOK, + gin.H{"data": "success"}, + ) + +} \ No newline at end of file diff --git a/server/src/presentation/handler/room.go b/server/src/presentation/handler/room.go new file mode 100644 index 0000000..249dfe2 --- /dev/null +++ b/server/src/presentation/handler/room.go @@ -0,0 +1,84 @@ +package handler + +import ( + "net/http" + + "github.com/Doer-org/hack-camp_vol9_2022-2/presentation/json" + "github.com/Doer-org/hack-camp_vol9_2022-2/usecase" + "github.com/gin-gonic/gin" +) + +type RoomHandler struct { + uc usecase.IRoomUsecase +} + +func NewRoomHandler(uc usecase.IRoomUsecase) *RoomHandler { + return &RoomHandler{ + uc: uc, + } +} + +func (rh *RoomHandler) NewRoom(ctx *gin.Context) { + var roomjson json.RoomJson + if err := ctx.BindJSON(&roomjson); err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + room := json.RoomJsonToEntity(&roomjson) + room, err := rh.uc.NewRoom(room.Id, room.Name, room.MaxMember, room.MemberCount) + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + roomJson := json.RoomEntityToJson(room) + ctx.JSON( + http.StatusOK, + gin.H{"data": roomJson}, + ) + +} + +func (rh *RoomHandler) GetRoomOfID(ctx *gin.Context) { + id := ctx.Param("id") + room, err := rh.uc.GetRoomOfID(id) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + roomJson := json.RoomEntityToJson(room) + ctx.JSON( + http.StatusOK, + gin.H{"data": roomJson}, + ) +} + +func (rh *RoomHandler) DeleteRoomOfID(ctx *gin.Context) { + id := ctx.Param("id") + err := rh.uc.DeleteRoomOfID(id) + + if err != nil { + ctx.JSON( + http.StatusBadRequest, + gin.H{"error": err.Error()}, + ) + return + } + + ctx.JSON( + http.StatusOK, + gin.H{"data": "success"}, + ) +} \ No newline at end of file diff --git a/server/src/presentation/json/room.go b/server/src/presentation/json/room.go new file mode 100644 index 0000000..8793a1d --- /dev/null +++ b/server/src/presentation/json/room.go @@ -0,0 +1,42 @@ +package json + +import "github.com/Doer-org/hack-camp_vol9_2022-2/domain/entity" + +type RoomJson struct { + Id string `json:"id"` + Name string `json:"name"` + MaxMember int `json:"max_member"` + MemberCount int `json:"member_count"` +} + +type RoomsJson []RoomJson + +type RoomIdJson string + +func RoomEntityToJson(c *entity.Room) *RoomJson { + return &RoomJson{ + Id: c.Id, + Name: c.Name, + MaxMember: c.MaxMember, + MemberCount: c.MemberCount, + } +} + +func RoomJsonToEntity(j *RoomJson) *entity.Room { + return &entity.Room{ + Id: j.Id, + Name: j.Name, + MaxMember: j.MaxMember, + MemberCount: j.MemberCount, + } +} + +func RoomIdEntityToJson(roomid string) RoomIdJson { + return RoomIdJson(roomid) +} + +// json to entity +func RoomIdJsonToEntity(r RoomIdJson) string { + return string(r) +} + diff --git a/server/src/presentation/router/middleware.go b/server/src/presentation/router/middleware.go new file mode 100644 index 0000000..2994a54 --- /dev/null +++ b/server/src/presentation/router/middleware.go @@ -0,0 +1,42 @@ +package router + +import ( + "time" + + "github.com/gin-contrib/cors" +) + +func (r *Router) setMiddleware() { + r.cors() +} + +// CorsはCORSの設定を用意します +func (r *Router) cors() { + r.Engine.Use(cors.New(cors.Config{ + // アクセスを許可したいアクセス元 + AllowOrigins: []string{ + "*", + }, + // アクセスを許可したいHTTPメソッド(以下の例だとPUTやDELETEはアクセスできません) + AllowMethods: []string{ + "POST", + "GET", + "DELETE", + "OPTIONS", + "PUT", + }, + // 許可したいHTTPリクエストヘッダ + AllowHeaders: []string{ + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Content-Type", + "Content-Length", + "Accept-Encoding", + "Authorization", + }, + // cookieなどの情報を必要とするかどうか + AllowCredentials: true, + // preflightリクエストの結果をキャッシュする時間 + MaxAge: 24 * time.Hour, + })) +} \ No newline at end of file diff --git a/server/src/presentation/router/room.go b/server/src/presentation/router/room.go new file mode 100644 index 0000000..9fa5386 --- /dev/null +++ b/server/src/presentation/router/room.go @@ -0,0 +1,20 @@ +package router + +import ( + "database/sql" + + "github.com/Doer-org/hack-camp_vol9_2022-2/infrastructure/persistance" + "github.com/Doer-org/hack-camp_vol9_2022-2/presentation/handler" + "github.com/Doer-org/hack-camp_vol9_2022-2/usecase" +) + +func (r *Router) InitRoomRouter(db *sql.DB) { + repo := persistance.NewRoomRepository(db) + uc := usecase.NewRoomUsecase(repo) + h := handler.NewRoomHandler(uc) + + g := r.Engine.Group("/room") + g.POST("/create", h.NewRoom) + g.GET("/:id", h.GetRoomOfID) + g.DELETE("/:id", h.DeleteRoomOfID) +} \ No newline at end of file diff --git a/server/src/presentation/router/router.go b/server/src/presentation/router/router.go new file mode 100644 index 0000000..0658000 --- /dev/null +++ b/server/src/presentation/router/router.go @@ -0,0 +1,31 @@ +package router + +import ( + "fmt" + + "github.com/jphacks/F_2205/server/src/config" + + "github.com/gin-gonic/gin" +) + +type Router struct { + Engine *gin.Engine +} + +// NewRouterは新しいRouterを初期化し構造体のポインタを返します +func NewRouter() *Router { + e := gin.Default() + r := &Router{ + Engine: e, + } + + // middlewareの設定 + r.setMiddleware() + + return r +} + +// Serveはhttpサーバーを起動します +func (r *Router) Serve() { + r.Engine.Run(fmt.Sprintf(":%s", config.Port())) +} \ No newline at end of file diff --git a/server/src/usecase/room.go b/server/src/usecase/room.go new file mode 100644 index 0000000..0b3fa57 --- /dev/null +++ b/server/src/usecase/room.go @@ -0,0 +1,71 @@ +package usecase + +import ( + "github.com/Doer-org/hack-camp_vol9_2022-2/domain/entity" + "github.com/Doer-org/hack-camp_vol9_2022-2/domain/repository" + usecase_error "github.com/Doer-org/hack-camp_vol9_2022-2/error/usecase" + "github.com/Doer-org/hack-camp_vol9_2022-2/utils" +) + +var _ IRoomUsecase = &RoomUsecase{} + +type RoomUsecase struct { + repo repository.IRoomRepository +} + +type IRoomUsecase interface { + NewRoom(id string, name string, max_member int, member_count int) (*entity.Room, error) + GetRoomOfID(id string) (*entity.Room, error) + DeleteAllRoom() error + DeleteRoomOfID(id string) error +} + +func NewRoomUsecase(repo repository.IRoomRepository) IRoomUsecase { + return &RoomUsecase{ + repo: repo, + } +} + +func (uc *RoomUsecase) NewRoom(id string, name string, max_member int, member_count int) (*entity.Room, error) { + if name == "" { + return nil, usecase_error.NameEmptyError + } + if max_member == 0 { + return nil, usecase_error.MaxMemberError + } + if member_count == 0 { + return nil, usecase_error.MemberCountError + } + + id = utils.GetHashId() + room, err := uc.repo.GetRoomOfID(id) + + if err != nil { + return nil, err + } + + if room.Name != "" { + return nil, usecase_error.RoomdIdUsedError + } + + room, err = uc.repo.NewRoom(id, name, max_member, member_count) + return room, err +} + +func (uc *RoomUsecase) GetRoomOfID(id string) (*entity.Room, error) { + room, err := uc.repo.GetRoomOfID(id) + return room, err +} + +func (uc *RoomUsecase) DeleteAllRoom() error { + err := uc.repo.DeleteAllRoom() + return err +} + +func (uc *RoomUsecase) DeleteRoomOfID(id string) error { + if id == "" { + return usecase_error.IdEmptyError + } + err := uc.repo.DeleteRoomOfID(id) + return err +} \ No newline at end of file diff --git a/server/src/usecase/service.go b/server/src/usecase/service.go new file mode 100644 index 0000000..1846186 --- /dev/null +++ b/server/src/usecase/service.go @@ -0,0 +1,9 @@ +package services + +import ( + "example/domain" +) + +type UsersService interface { + AddUsers(user *domain.User) ([]*domain.User, error) +} diff --git a/server/src/utils/env.go b/server/src/utils/env.go new file mode 100644 index 0000000..a4fcd8c --- /dev/null +++ b/server/src/utils/env.go @@ -0,0 +1,13 @@ +package utils + +import "os" + +// GetEnvOrDefaultはenvPathに指定された環境変数を取得する +// 取得できなかった場合はdefaultEnvを利用する +func GetEnvOrDefault(envPath string, defaultEnv string) string { + env := os.Getenv(envPath) + if env == "" { + return defaultEnv + } + return env +} \ No newline at end of file