// create a service func (c *ServiceController) Create(res http.ResponseWriter, req services.AuxRequestContext, db *services.DB) { // parse request body var body createBody if err := c.ParseJsonBody(req, &body); err != nil { services.Res(res).Error(400, "invalid_client", "request body is invalid or malformed. Expects valid json body") return } // name is required if c.validate.IsEmpty(body.FullName) { services.Res(res).Error(400, "missing_parameter", "Missing required field: full_name") return } // full name must have max of 60 characters if !validator.StringLength(body.FullName, "1", "60") { services.Res(res).Error(400, "invalid_full_name", "full_name character limit is 60") return } // service name is required if c.validate.IsEmpty(body.ServiceName) { services.Res(res).Error(400, "missing_parameter", "Missing required field: service_name") return } // service name must have max of 30 characters if !validator.StringLength(body.ServiceName, "1", "60") { services.Res(res).Error(400, "invalid_service_name", "service_name character limit is 60") return } // description is required if c.validate.IsEmpty(body.Description) { services.Res(res).Error(400, "missing_parameter", "Missing required field: description") return } // description must have max of 140 characters if !validator.StringLength(body.Description, "1", "140") { services.Res(res).Error(400, "invalid_description", "description character limit is 140") return } // email is required if c.validate.IsEmpty(body.Email) { services.Res(res).Error(400, "missing_parameter", "Missing required field: email") return } // email must be valid if !validator.IsEmail(body.Email) { services.Res(res).Error(400, "invalid_email", "email is invalid") return } // create identity newIdentity := &models.Identity{ ObjectID: bson.NewObjectId().Hex(), FullName: body.FullName, Email: body.Email, } // start db transaction dbTx := db.GetPostgresHandle().Begin() if err := models.CreateIdentity(dbTx, newIdentity); err != nil { dbTx.Rollback() c.log.Error(err.Error()) services.Res(res).Error(500, "", "server error") return } // create client credentials clientId := services.GetRandString(services.GetRandNumRange(32, 42)) clientSecret := services.GetRandString(services.GetRandNumRange(32, 42)) // create new service object newService := models.Service{ ObjectID: bson.NewObjectId().Hex(), Name: body.ServiceName, Description: body.Description, ClientID: clientId, ClientSecret: clientSecret, Identity: newIdentity, } // create service err := models.CreateService(dbTx, &newService) if err != nil { dbTx.Rollback() c.log.Error(err.Error()) services.Res(res).Error(500, "", "server error") return } // commit db transaction dbTx.Commit() // send response respObj, _ := services.StructToJsonToMap(newService) services.Res(res).Json(respObj) }
// create an identity func (c *IdentityController) Create(res http.ResponseWriter, req services.AuxRequestContext, db *services.DB) { // parse request body var body identityCreateBody if err := c.ParseJsonBody(req, &body); err != nil { services.Res(res).Error(400, "invalid_body", "request body is invalid or malformed. Expects valid json body") return } // full name is required if validator.IsNull(body.FullName) { services.Res(res).Error(400, "missing_parameter", "Missing required field: full_name") return } // email is required if validator.IsNull(body.Email) { services.Res(res).Error(400, "missing_parameter", "Missing required field: email") return } // email is required if !validator.IsEmail(body.Email) { services.Res(res).Error(400, "invalid_email", "email is invalid") return } // create identity newIdentity := models.Identity{ ObjectID: bson.NewObjectId().Hex(), FullName: body.FullName, Email: body.Email, } // if request is from Issuer controller, set issuer field to true if d := req.GetData("isIssuer"); d != nil && d.(bool) { // object is required if validator.IsNull(body.ObjectName) { services.Res(res).Error(400, "missing_parameter", "Missing required field: object_name") return } // base currency is required if validator.IsNull(body.BaseCurrency) { services.Res(res).Error(400, "missing_parameter", "Missing required field: base_currency") return } // base currency must be supported if !services.StringInStringSlice(config.SupportedBaseCurrencies, body.BaseCurrency) { services.Res(res).Error(400, "invalid_base_currency", "base currency is unknown") return } newIdentity.Issuer = true newIdentity.ObjectName = body.ObjectName newIdentity.BaseCurrency = body.BaseCurrency } err := models.CreateIdentity(db.GetPostgresHandle(), &newIdentity) if err != nil { c.log.Error(err.Error()) services.Res(res).Error(500, "", "server error") return } // create response respObj, _ := services.StructToJsonToMap(newIdentity) if newIdentity.Issuer { respObj["soul_balance"] = newIdentity.SoulBalance } services.Res(res).Json(respObj) }