├── .gitignore ├── README.md ├── event ├── EventService.go ├── EventServiceClient.go ├── ReponseLogger.go └── dao │ ├── EventDaoInMemoryImpl.go │ ├── EventDaoMySqlImpl.go │ ├── EventDaoMySqlOrmImpl.go │ ├── IEventDao.go │ └── Model.go ├── http-utils └── middlewares.go ├── main.go └── swagger.json /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | go-crud 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # go-crud 2 | CRUD service to learn Golang 3 | -------------------------------------------------------------------------------- /event/EventService.go: -------------------------------------------------------------------------------- 1 | package event 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/gorilla/mux" 6 | "github.com/kislayverma/go-crud/event/dao" 7 | "github.com/kislayverma/go-crud/http-utils" 8 | "io/ioutil" 9 | "log" 10 | "net/http" 11 | "strconv" 12 | ) 13 | 14 | type EventService struct { 15 | Db dao.IEventDao 16 | Router *mux.Router 17 | } 18 | 19 | func (svc EventService) RegisterRoutes() { 20 | subRouter := svc.Router.PathPrefix("/event").Subrouter() 21 | subRouter.HandleFunc("", svc.createEvent).Methods("POST") 22 | subRouter.HandleFunc("", svc.getAllEvents).Methods("GET") 23 | subRouter.HandleFunc("/{id}", svc.getOneEvent).Methods("GET") 24 | subRouter.HandleFunc("/{id}", svc.updateEvent).Methods("PATCH") 25 | subRouter.HandleFunc("/{id}", svc.deleteEvent).Methods("DELETE") 26 | subRouter.HandleFunc("/validate/{id}", svc.validateEventExists).Methods("GET") 27 | } 28 | 29 | func (svc EventService) getOneEvent(w http.ResponseWriter, r *http.Request) { 30 | // swagger:operation GET /event/{id} Event getEvent 31 | // --- 32 | // summary: Return the event identified by the id. 33 | // description: If the event is found, it will be returned else Error Not Found (404) will be returned. 34 | // parameters: 35 | // - name: id 36 | // in: path 37 | // description: id of the event 38 | // type: string 39 | // required: true 40 | // responses: 41 | // "200": 42 | // "$ref": "#/responses/event" 43 | // "400": 44 | // "$ref": "#/responses/event" 45 | // "404": 46 | // "$ref": "#/responses/notFoundReq" 47 | eventID, err := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) 48 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 49 | 50 | if err != nil { 51 | log.Println("Failed to parse the id") 52 | w.WriteHeader(http.StatusBadRequest) 53 | } else { 54 | var event dao.Event = svc.Db.FindById(eventID) 55 | if event.ID == 0 { 56 | w.WriteHeader(http.StatusNotFound) 57 | } else { 58 | json.NewEncoder(w).Encode(event) 59 | } 60 | } 61 | } 62 | 63 | func (svc EventService) getAllEvents(w http.ResponseWriter, r *http.Request) { 64 | // swagger:operation GET /event Event getAllEvents 65 | // --- 66 | // summary: Return all the events from the store 67 | // description: If event are found array of events will be returned, else an empty JSON array will be returned. 68 | // parameters: 69 | // responses: 70 | // "200": 71 | // "$ref": "#/responses/accountRes" 72 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 73 | json.NewEncoder(w).Encode(svc.Db.GetAll()) 74 | } 75 | 76 | func (svc EventService) createEvent(w http.ResponseWriter, r *http.Request) { 77 | // swagger:operation POST /event/ Event createEvent 78 | // --- 79 | // summary: Creates an event with the give title and description and assign a new id to it 80 | // description: Creates an event with the give title and description and assign a new id to it 81 | // parameters: 82 | // - name: event 83 | // in: body 84 | // description: title and description of the event 85 | // type: event 86 | // required: true 87 | // "$ref": "#/responses/event" 88 | // responses: 89 | // "200": 90 | // "$ref": "#/responses/event" 91 | // "400": 92 | // "$ref": "#/responses/event" 93 | // "404": 94 | // "$ref": "#/responses/notFoundReq" 95 | var newEvent dao.Event 96 | reqBody, err := ioutil.ReadAll(r.Body) 97 | if err != nil { 98 | log.Println("Kindly enter data with the event title and description only in order to update") 99 | } 100 | 101 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 102 | json.Unmarshal(reqBody, &newEvent) 103 | log.Printf("Incoming event %v", newEvent) 104 | svc.Db.Insert(newEvent) 105 | 106 | w.WriteHeader(http.StatusCreated) 107 | } 108 | 109 | func (svc EventService) updateEvent(w http.ResponseWriter, r *http.Request) { 110 | eventId, err := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) 111 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 112 | 113 | if err != nil { 114 | log.Println("Failed to parse the id") 115 | w.WriteHeader(http.StatusBadRequest) 116 | } else { 117 | var updatedEvent dao.Event 118 | 119 | reqBody, err := ioutil.ReadAll(r.Body) 120 | if err != nil { 121 | log.Println("Kindly enter data with the event title and description only in order to update") 122 | } 123 | json.Unmarshal(reqBody, &updatedEvent) 124 | 125 | var existingEvent dao.Event = svc.Db.FindById(eventId) 126 | if existingEvent.ID == 0 { 127 | w.WriteHeader(http.StatusNotFound) 128 | } else { 129 | existingEvent.Title = updatedEvent.Title 130 | existingEvent.Description = updatedEvent.Description 131 | svc.Db.Update(eventId, existingEvent) 132 | w.WriteHeader(http.StatusOK) 133 | } 134 | } 135 | } 136 | 137 | func (svc EventService) deleteEvent(w http.ResponseWriter, r *http.Request) { 138 | eventId, err := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) 139 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 140 | 141 | if err != nil { 142 | log.Println("Failed to parse the id") 143 | w.WriteHeader(http.StatusBadRequest) 144 | } else { 145 | log.Printf("Trying to delete event with id %d", eventId) 146 | var existingEvent dao.Event = svc.Db.FindById(eventId) 147 | if existingEvent.ID == 0 { 148 | w.WriteHeader(http.StatusNotFound) 149 | } else { 150 | svc.Db.DeleteById(eventId) 151 | w.WriteHeader(http.StatusOK) 152 | } 153 | } 154 | } 155 | 156 | func (svc EventService) validateEventExists(w http.ResponseWriter, r *http.Request) { 157 | eventId, err := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) 158 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 159 | 160 | reqContext := http_utils.GetRequestContext(r, r.Header[http_utils.REQUEST_ID_HEADER_NAME][0]) 161 | 162 | if err != nil { 163 | log.Println(reqContext.RequestId, "Failed to parse the id") 164 | w.WriteHeader(http.StatusBadRequest) 165 | } else { 166 | responseChannel := make(chan bool) 167 | go getEvent(reqContext, eventId, responseChannel) 168 | eventFound := <- responseChannel 169 | w.WriteHeader(http.StatusOK) 170 | if eventFound { 171 | go logResponse(reqContext, "Event With id " + strconv.FormatInt(eventId, 10) + " was found") 172 | } else { 173 | go logResponse(reqContext,"Event With id " + strconv.FormatInt(eventId, 10) + " was not found") 174 | } 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /event/EventServiceClient.go: -------------------------------------------------------------------------------- 1 | package event 2 | 3 | import ( 4 | "github.com/kislayverma/go-crud/http-utils" 5 | "log" 6 | "net/http" 7 | "strconv" 8 | "time" 9 | ) 10 | 11 | func getEvent(reqCtx http_utils.RequestContext, id int64, responseChannel chan bool) { 12 | var url string = "http://localhost:8080/event/" + strconv.FormatInt(id, 10) 13 | log.Print("Invoking url ", url) 14 | req, err := http.NewRequest("GET", url, nil) 15 | if err != nil { 16 | log.Fatal("Unable to create request", err.Error()) 17 | } 18 | req.Header.Set(http_utils.REQUEST_ID_HEADER_NAME, reqCtx.RequestId) 19 | req.Header.Set("Accept", "application/json") 20 | client := &http.Client{Timeout: time.Second * 1} 21 | resp, err := client.Do(req) 22 | if err != nil { 23 | responseChannel <- false 24 | } 25 | 26 | if resp.StatusCode == 200 { 27 | responseChannel <- true 28 | } else { 29 | responseChannel <- false 30 | } 31 | resp.Body.Close() 32 | } 33 | -------------------------------------------------------------------------------- /event/ReponseLogger.go: -------------------------------------------------------------------------------- 1 | package event 2 | 3 | import ( 4 | "github.com/kislayverma/go-crud/http-utils" 5 | "log" 6 | ) 7 | 8 | func logResponse(reqCtx http_utils.RequestContext, response string) { 9 | log.Print(reqCtx.RequestId, " : Response in ResponseLogger ", response) 10 | } 11 | -------------------------------------------------------------------------------- /event/dao/EventDaoInMemoryImpl.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "log" 5 | ) 6 | 7 | type EventInMemoryDao struct { 8 | events map[int64] Event 9 | eventIdCount int64 10 | } 11 | 12 | func (dao EventInMemoryDao) InitDb() { 13 | // do nothing 14 | } 15 | 16 | func (dao EventInMemoryDao) FindById(id int64) Event { 17 | log.Printf("returning event from DB : %v", dao.events[id]) 18 | return dao.events[id] 19 | } 20 | 21 | func (dao EventInMemoryDao) Insert(event Event) { 22 | var newEventForDb = Event{int64(len(dao.events)) + 1, event.Title, event.Description} 23 | dao.events[newEventForDb.ID] = newEventForDb 24 | log.Printf("Inserted event in DB : %v", dao.events[newEventForDb.ID]) 25 | log.Printf("Record count : %d", len(dao.events)); 26 | } 27 | 28 | func (dao EventInMemoryDao) Update(id int64, event Event) { 29 | dao.events[id] = event 30 | log.Printf("Updated event in DB : %v", dao.events[event.ID]) 31 | } 32 | 33 | func (dao EventInMemoryDao) GetAll() []Event { 34 | var values = make([]Event, len(dao.events)) 35 | idx := 0 36 | for _, value := range dao.events { 37 | values[idx] = value 38 | idx++ 39 | } 40 | 41 | return values 42 | } 43 | 44 | func (dao EventInMemoryDao) DeleteById(id int64) { 45 | delete(dao.events, id) 46 | } -------------------------------------------------------------------------------- /event/dao/EventDaoMySqlImpl.go: -------------------------------------------------------------------------------- 1 | // Code credit - https://medium.com/@hugo.bjarred/mysql-and-golang-ea0d620574d2 2 | // Code credit - https://medium.com/@hugo.bjarred/rest-api-with-golang-mux-mysql-c5915347fa5b 3 | package dao 4 | 5 | import ( 6 | "database/sql" 7 | _ "github.com/go-sql-driver/mysql" 8 | "log" 9 | ) 10 | 11 | type EventMySqlDao struct { 12 | db *sql.DB 13 | } 14 | 15 | func (dao EventMySqlDao) InitDb() { 16 | // Do nothing 17 | } 18 | 19 | func (dao EventMySqlDao) FindById(id int64) Event { 20 | log.Println("Searching DB for event id ", id) 21 | data, err := dao.db.Query("SELECT id, title, description FROM event WHERE id = ?", id) 22 | if err != nil { 23 | log.Panic("Error running query : %v", err.Error()) 24 | } 25 | 26 | var event Event 27 | for data.Next() { 28 | err := data.Scan(&event.ID, &event.Title, &event.Description) 29 | if err != nil { 30 | log.Panic(err.Error()) 31 | } 32 | } 33 | 34 | return event 35 | } 36 | 37 | func (dao EventMySqlDao) Insert(event Event) { 38 | stmt, err := dao.db.Prepare("INSERT INTO event (title,description) VALUES (?, ?)") 39 | if err != nil { 40 | log.Panic("Error preparing query : %v", err.Error()) 41 | } 42 | _, runErr := stmt.Exec(event.Title, event.Description) 43 | if runErr != nil { 44 | log.Panic("Error running query : %v", err.Error()) 45 | } 46 | 47 | log.Printf("Inserted event in DB") 48 | } 49 | 50 | func (dao EventMySqlDao) Update(id int64, event Event) { 51 | stmt, err := dao.db.Prepare("UPDATE event SET title = ?, description=? WHERE id = ?") 52 | if err != nil { 53 | log.Panic("Error preparing query : %v", err.Error()) 54 | } 55 | _, runErr := stmt.Exec(event.Title, event.Description, id) 56 | if runErr != nil { 57 | log.Panic("Error running query : %v", err.Error()) 58 | } 59 | 60 | log.Printf("Updated event in DB") 61 | } 62 | 63 | func (dao EventMySqlDao) GetAll() []Event { 64 | data, err := dao.db.Query("SELECT id, title, description FROM event") 65 | if err != nil { 66 | log.Panic("Error running query : %v", err.Error()) 67 | } 68 | 69 | var events []Event 70 | for data.Next() { 71 | var event Event 72 | err := data.Scan(&event.ID, &event.Title, &event.Description) 73 | if err != nil { 74 | panic(err.Error()) 75 | } 76 | events = append(events, event) 77 | } 78 | 79 | return events 80 | } 81 | 82 | func (dao EventMySqlDao) DeleteById(id int64) { 83 | stmt, err := dao.db.Prepare("DELETE FROM event where id = ?") 84 | if err != nil { 85 | log.Panic("Error preparing query : %v", err.Error()) 86 | } 87 | _, runErr := stmt.Exec(id) 88 | if runErr != nil { 89 | log.Panic("Error running query : %v", err.Error()) 90 | } 91 | 92 | log.Printf("Deleted event from DB") 93 | } 94 | -------------------------------------------------------------------------------- /event/dao/EventDaoMySqlOrmImpl.go: -------------------------------------------------------------------------------- 1 | // Code credit - http://gorm.io/docs/index.html 2 | // Code credit - https://medium.com/@adigunhammedolalekan/build-and-deploy-a-secure-rest-api-with-go-postgresql-jwt-and-gorm-6fadf3da505b 3 | package dao 4 | 5 | import ( 6 | _ "github.com/jinzhu/gorm/dialects/mysql" 7 | "github.com/jinzhu/gorm" 8 | "log" 9 | ) 10 | 11 | type EventMySqlOrmDao struct { 12 | Db *gorm.DB 13 | } 14 | 15 | func (dao EventMySqlOrmDao) InitDb() { 16 | // I like table names to be singulars 17 | // http://gorm.io/docs/conventions.html#Pluralized-Table-Name 18 | dao.Db.SingularTable(true) 19 | } 20 | 21 | func (dao EventMySqlOrmDao) FindById(id int64) Event { 22 | log.Println("Searching DB for event id ", id) 23 | var event Event 24 | dao.Db.First(&event, id) 25 | 26 | return event 27 | } 28 | 29 | func (dao EventMySqlOrmDao) Insert(event Event) { 30 | log.Println("Inserting event into DB") 31 | dao.Db.Create(&event) 32 | } 33 | 34 | func (dao EventMySqlOrmDao) Update(id int64, event Event) { 35 | log.Println("Updating DB for event id ", id) 36 | 37 | var existingEvent = dao.FindById(id) 38 | existingEvent.Title = event.Title 39 | existingEvent.Description = event.Description 40 | dao.Db.Save(existingEvent) 41 | 42 | log.Printf("Updated event in DB") 43 | } 44 | 45 | func (dao EventMySqlOrmDao) GetAll() []Event { 46 | log.Println("Searching all events in DB") 47 | 48 | var events []Event 49 | dao.Db.Find(&events) 50 | 51 | return events 52 | } 53 | 54 | func (dao EventMySqlOrmDao) DeleteById(id int64) { 55 | log.Println("Deleting from DB for event id ", id) 56 | dao.Db.Delete(dao.FindById(id)) 57 | log.Printf("Deleted event from DB") 58 | } 59 | -------------------------------------------------------------------------------- /event/dao/IEventDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | type IEventDao interface { 4 | InitDb() 5 | FindById(id int64) Event 6 | Insert(event Event) 7 | Update(id int64, event Event) 8 | GetAll() []Event 9 | DeleteById(id int64) 10 | } 11 | -------------------------------------------------------------------------------- /event/dao/Model.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | // swagger:response event 4 | // Event Json request payload is as follows, 5 | //{ 6 | // "id": "1", 7 | // "title": "some title", 8 | // "description": "some description" 9 | //} 10 | type Event struct { 11 | ID int64 `json:"id"` 12 | Title string `json:"title"` 13 | Description string `json:"description"` 14 | } 15 | -------------------------------------------------------------------------------- /http-utils/middlewares.go: -------------------------------------------------------------------------------- 1 | // Code credits : https://www.gorillatoolkit.org/pkg/context 2 | // Code credits : https://godoc.org/github.com/gorilla/mux 3 | package http_utils 4 | 5 | import ( 6 | "github.com/google/uuid" 7 | "github.com/gorilla/context" 8 | "log" 9 | "net/http" 10 | ) 11 | 12 | const REQUEST_ID_HEADER_NAME string = "X-Req-Id" 13 | 14 | type RequestContext struct { 15 | RequestId string 16 | } 17 | 18 | func GetRequestContext(r *http.Request, key string) RequestContext { 19 | if rv := context.Get(r, key); rv != nil { 20 | return rv.(RequestContext) 21 | } else { 22 | setRequestContext(r, uuid.New().String()) 23 | } 24 | return RequestContext{""} 25 | } 26 | 27 | func CorrelationIdSettingMw (next http.Handler) http.Handler { 28 | return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 29 | _, ok := r.Header[REQUEST_ID_HEADER_NAME] 30 | if !ok { 31 | newReqId := uuid.New().String() 32 | setRequestContext(r, newReqId) 33 | r.Header[REQUEST_ID_HEADER_NAME] = []string {newReqId} 34 | } 35 | 36 | next.ServeHTTP(w, r) 37 | context.Clear(r) 38 | }) 39 | } 40 | 41 | func RequestLoggingMw(next http.Handler) http.Handler { 42 | return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 43 | // Log request 44 | log.Printf("\n================Incoming request===============\n%s\n%s\n===============================================", 45 | r.RequestURI, r.Header) 46 | 47 | // Call the next handler 48 | next.ServeHTTP(w, r) 49 | 50 | // Log response headers 51 | log.Printf("\n================Outgoing Response===============\n%s\n================================================", 52 | w.Header()) 53 | }) 54 | } 55 | 56 | func setRequestContext(r *http.Request, requestId string) { 57 | reqCtx := RequestContext{requestId} 58 | context.Set(r, requestId, reqCtx) 59 | } -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // Go-CRUD Service 2 | // 3 | // Sample CRUD service built in Go, to learn Go 4 | // 5 | // Schemes: http 6 | // Host: localhost:8080 7 | // Version: 0.0.1 8 | // License: MIT http://opensource.org/licenses/MIT 9 | // Contact: Kislay 10 | // 11 | // Consumes: 12 | // - application/json 13 | // 14 | // Produces: 15 | // - application/json 16 | // 17 | // swagger:meta 18 | package main 19 | 20 | import ( 21 | "fmt" 22 | "github.com/gorilla/mux" 23 | "github.com/jinzhu/gorm" 24 | "github.com/kislayverma/go-crud/event" 25 | "github.com/kislayverma/go-crud/event/dao" 26 | "github.com/kislayverma/go-crud/http-utils" 27 | "log" 28 | "net/http" 29 | ) 30 | 31 | var eventService event.EventService 32 | 33 | // Swagger setup credit : 34 | // https://medium.com/@supun.muthutantrige/lets-go-everything-you-need-to-know-about-creating-a-restful-api-in-go-part-iv-52666c5221d4 35 | func main() { 36 | // Initialize the database access layer 37 | // Not the best : conn details leaking into main program - need to enable configs driven something something 38 | // TODO - Make this work 39 | // This is what I want, but the connection gets closed when I do it in the build*Dao methods below. 40 | // db = buildMySqlOrmDao() 41 | dbConn, err := gorm.Open("mysql", "root:@(localhost)/gocrud") 42 | if err != nil { 43 | log.Panic(err.Error()) 44 | panic(err.Error()) 45 | } 46 | 47 | db := dao.EventMySqlOrmDao{dbConn} 48 | db.InitDb() 49 | defer dbConn.Close() 50 | 51 | // Initialize the request router 52 | router := mux.NewRouter().StrictSlash(true) 53 | router.Use(http_utils.CorrelationIdSettingMw) 54 | router.Use(http_utils.RequestLoggingMw) 55 | 56 | // Set up top level routes 57 | router.HandleFunc("/", homeLink) 58 | router.HandleFunc("/swagger.json", swagger).Methods("GET") 59 | // Create Event service and let it register its routes 60 | eventService = event.EventService{db, router} 61 | eventService.RegisterRoutes() 62 | 63 | // Launch the server 64 | log.Fatal(http.ListenAndServe(":8080", router)) 65 | } 66 | 67 | func homeLink(w http.ResponseWriter, r *http.Request) { 68 | // Code Credit : https://medium.com/the-andela-way/build-a-restful-json-api-with-golang-85a83420c9da 69 | 70 | // swagger:operation GET / Hello Hello 71 | // 72 | // Returns a simple Hello message 73 | // --- 74 | // consumes: 75 | // - text/plain 76 | // produces: 77 | // - text/plain 78 | // responses: 79 | // '200': 80 | // description: The hello message 81 | // type: string 82 | fmt.Fprintf(w, "Welcome home!") 83 | } 84 | 85 | func swagger(w http.ResponseWriter, r *http.Request) { 86 | w.Header().Set("Content-Type", "application/json") 87 | http.ServeFile(w, r, "swagger.json") 88 | } 89 | -------------------------------------------------------------------------------- /swagger.json: -------------------------------------------------------------------------------- 1 | { 2 | "swagger": "2.0", 3 | "info": {}, 4 | "paths": { 5 | "/": { 6 | "get": { 7 | "description": "Returns a simple Hello message", 8 | "consumes": [ 9 | "text/plain" 10 | ], 11 | "produces": [ 12 | "text/plain" 13 | ], 14 | "tags": [ 15 | "Hello" 16 | ], 17 | "operationId": "Hello", 18 | "responses": { 19 | "200": { 20 | "description": "The hello message" 21 | } 22 | } 23 | } 24 | }, 25 | "/event": { 26 | "get": { 27 | "description": "If event are found array of events will be returned, else an empty JSON array will be returned.", 28 | "tags": [ 29 | "Event" 30 | ], 31 | "summary": "Return all the events from the store", 32 | "operationId": "getAllEvents", 33 | "responses": { 34 | "200": { 35 | "$ref": "#/responses/accountRes" 36 | } 37 | } 38 | } 39 | }, 40 | "/event/": { 41 | "post": { 42 | "description": "Creates an event with the give title and description and assign a new id to it", 43 | "tags": [ 44 | "Event" 45 | ], 46 | "summary": "Creates an event with the give title and description and assign a new id to it", 47 | "operationId": "createEvent", 48 | "parameters": [ 49 | { 50 | "$ref": "#/responses/event", 51 | "type": "event", 52 | "description": "title and description of the event", 53 | "name": "event", 54 | "in": "body", 55 | "required": true 56 | } 57 | ], 58 | "responses": { 59 | "200": { 60 | "$ref": "#/responses/event" 61 | }, 62 | "400": { 63 | "$ref": "#/responses/event" 64 | }, 65 | "404": { 66 | "$ref": "#/responses/notFoundReq" 67 | } 68 | } 69 | } 70 | }, 71 | "/event/{id}": { 72 | "get": { 73 | "description": "If the event is found, it will be returned else Error Not Found (404) will be returned.", 74 | "tags": [ 75 | "Event" 76 | ], 77 | "summary": "Return the event identified by the id.", 78 | "operationId": "getEvent", 79 | "parameters": [ 80 | { 81 | "type": "string", 82 | "description": "id of the event", 83 | "name": "id", 84 | "in": "path", 85 | "required": true 86 | } 87 | ], 88 | "responses": { 89 | "200": { 90 | "$ref": "#/responses/event" 91 | }, 92 | "400": { 93 | "$ref": "#/responses/event" 94 | }, 95 | "404": { 96 | "$ref": "#/responses/notFoundReq" 97 | } 98 | } 99 | } 100 | } 101 | }, 102 | "responses": { 103 | "event": { 104 | "headers": { 105 | "description": { 106 | "type": "string" 107 | }, 108 | "id": { 109 | "type": "integer", 110 | "format": "int64" 111 | }, 112 | "title": { 113 | "type": "string" 114 | } 115 | } 116 | } 117 | } 118 | } --------------------------------------------------------------------------------