api/enum_handler.go (63 lines of code) (raw):

// Copyright (c) 2017-2018 Uber Technologies, Inc. // // 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 api import ( "encoding/json" "github.com/gorilla/mux" "github.com/uber/aresdb/api/common" "github.com/uber/aresdb/memstore" metaCom "github.com/uber/aresdb/metastore/common" "github.com/uber/aresdb/utils" "net/http" ) // EnumHandler handlers enum rw type EnumHandler struct { memStore memstore.MemStore metastore metaCom.MetaStore } // NewEnumHandler returns a new enum handler func NewEnumHandler(memStore memstore.MemStore, metastore metaCom.MetaStore) *EnumHandler { return &EnumHandler{ memStore: memStore, metastore: metastore, } } // Register regists paths func (handler *EnumHandler) Register(router *mux.Router, wrappers ...utils.HTTPHandlerWrapper) { router.HandleFunc("/tables/{table}/columns/{column}/enum-cases", utils.ApplyHTTPWrappers(handler.ListEnumCases, wrappers...)).Methods(http.MethodGet) router.HandleFunc("/tables/{table}/columns/{column}/enum-cases", utils.ApplyHTTPWrappers(handler.AddEnumCase, wrappers...)).Methods(http.MethodPost) } // ListEnumCases swagger:route GET /schema/tables/{table}/columns/{column}/enum-cases listEnumCases // list existing enumCases for given table and column // // Responses: // default: errorResponse // 200: listEnumCasesResponse func (handler *EnumHandler) ListEnumCases(w *utils.ResponseWriter, r *http.Request) { var listEnumCasesRequest ListEnumCasesRequest var listEnumCasesResponse ListEnumCasesResponse err := common.ReadRequest(r, &listEnumCasesRequest) if err != nil { w.WriteError(err) return } tableSchema, err := handler.memStore.GetSchema(listEnumCasesRequest.TableName) if err != nil { w.WriteError(ErrTableDoesNotExist) return } tableSchema.RLock() enumDict, columnExist := tableSchema.EnumDicts[listEnumCasesRequest.ColumnName] if !columnExist { tableSchema.RUnlock() w.WriteError(ErrColumnDoesNotExist) return } listEnumCasesResponse.JSONBuffer, err = json.Marshal(enumDict.ReverseDict) tableSchema.RUnlock() w.WriteJSONBytes(listEnumCasesResponse.JSONBuffer, err) } // AddEnumCase swagger:route POST /schema/tables/{table}/columns/{column}/enum-cases addEnumCase // add an enum case to given column of given table // return the id of the enum // // Responses: // default: errorResponse // 200: addEnumCaseResponse func (handler *EnumHandler) AddEnumCase(w *utils.ResponseWriter, r *http.Request) { var addEnumCaseRequest AddEnumCaseRequest var addEnumCaseResponse AddEnumCaseResponse err := common.ReadRequest(r, &addEnumCaseRequest) if err != nil { w.WriteError(err) return } addEnumCaseResponse.Body, err = handler.metastore.ExtendEnumDict(addEnumCaseRequest.TableName, addEnumCaseRequest.ColumnName, addEnumCaseRequest.Body.EnumCases) if err != nil { // TODO: need mapping from metaStore error to api error // for metaStore error might also be user error w.WriteError(err) return } w.WriteObject(addEnumCaseResponse.Body) }