Files

325 lines
19 KiB
Go

package main
import (
"net/http"
"otaupdate/controllers"
"otaupdate/handlers"
"otaupdate/services"
a "github.com/fiskerinc/cloud-services/pkg/adminroles"
"github.com/fiskerinc/cloud-services/pkg/common/authproviders"
h "github.com/fiskerinc/cloud-services/pkg/httphandlers"
"github.com/fiskerinc/cloud-services/pkg/logger"
"github.com/fiskerinc/cloud-services/pkg/tracer"
"github.com/fiskerinc/cloud-services/pkg/utils/app"
"gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter"
)
var authChecker h.AuthCheckerInterface
func init() {
app.Setup("ota update go", cleanup)
handlers.InitSwaggerDoc()
authChecker = &h.AuthAPIToken{
APITokens: services.GetDB().GetAPITokens(),
APICalls: services.GetDB().GetAPICalls(),
JWTAuth: true,
}
}
func main() {
defer cleanup()
tracer.Start()
defer tracer.Stop()
const port string = ":8077"
// Enables profiling of application. Run `go get github.com/pkg/profile` for profiling package
// defer profile.Start(profile.MemProfile, profile.MemProfileRate(1), profile.ProfilePath(".")).Stop()
swagger := h.GetSwaggerHandler()
router := httprouter.New()
router.PanicHandler = h.HttpRouterPanicHandler
readRoles := []a.RoleID{a.RoleCreate, a.RoleReadOnly}
createRole := []a.RoleID{a.RoleCreate}
deleteRole := []a.RoleID{a.RoleDelete}
supplierAdminRole := []a.RoleID{a.RoleSupplierApprover}
updateDeployRole := []a.RoleID{a.RoleUpdateDeploy}
// this means only Fisker AD and API Key can access
permissionRead := a.RoleMap{
authproviders.FiskerAD: readRoles,
authproviders.FiskerAPIKey: readRoles,
}
permissionCreate := a.RoleMap{
authproviders.FiskerAD: createRole,
authproviders.FiskerAPIKey: createRole,
}
permissionDelete := a.RoleMap{
authproviders.FiskerAD: deleteRole,
authproviders.FiskerAPIKey: deleteRole,
}
permissionSupplierAdmin := a.RoleMap{
authproviders.FiskerAD: supplierAdminRole,
authproviders.FiskerAPIKey: supplierAdminRole,
}
permissionManufacture := a.RoleMap{
authproviders.FiskerAPIKey: {a.RoleManufacture},
}
permissionMigrate := a.RoleMap{
authproviders.FiskerAD: {a.RoleManifestMigration},
authproviders.FiskerAPIKey: {a.RoleManifestMigration},
}
permissionUpdateDeploy := a.RoleMap{
authproviders.FiskerAD: updateDeployRole,
authproviders.FiskerAPIKey: updateDeployRole,
}
// Change it to Magna as soon as you get groupIDs.
magnaAccess := a.RoleMap{
authproviders.Magna: []a.RoleID{a.RoleMagna},
authproviders.FiskerQA: []a.RoleID{a.RoleManufacture},
}
carDiagnostic := a.RoleMap{
authproviders.Default: []a.RoleID{a.RoleCarDiagnostic},
authproviders.FiskerAPIKey: []a.RoleID{a.RoleCarDiagnostic},
}
addHandler(router, nil, http.MethodGet, "/docs/*path", swagger)
// ### APICALL ###
addHandler(router, permissionRead, http.MethodGet, "/apicalls", handlers.HandleAPICallsGet)
// ### APITOKEN ###
addHandler(router, permissionRead, http.MethodGet, "/apitokens", handlers.HandleAPITokensGetList)
addHandler(router, permissionCreate, http.MethodPost, "/apitoken", handlers.HandleAPITokenAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/apitoken", handlers.HandleAPITokenDelete)
addHandler(router, permissionCreate, http.MethodPut, "/apitoken", handlers.HandleAPITokenUpdate)
// ### CANSIGNAL ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/cansignals/:vin", handlers.HandleVehiclesSignals)
addHandler(router, permissionRead, http.MethodGet, "/can_signals_export", handlers.HandleCanSignalVINGet)
addHandler(router, permissionRead, http.MethodGet, "/can_signals_list", handlers.HandleCanSignalListGet)
addHandler(router, permissionRead, http.MethodGet, "/can_signals/:dbc", handlers.HandleDBCSignalsGetList)
// ### CARCONFIG ###
addHandler(router, permissionCreate, http.MethodGet, "/car_config/:vin", handlers.GetCarConfiguration)
addHandler(router, permissionUpdateDeploy, http.MethodPost, "/car_config/:vin", handlers.CarConfigurationUpdate)
// ### CARSCONNECTED ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodPost, "/carsconnected", handlers.HandleVehicleConnectionStatuses)
// ### CARSLOCATION ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/carslocations", handlers.HandleVehiclesLocations)
// ### CARSTATE ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/carstate", handlers.HandleVehicleState)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodPost, "/carstate_multi", handlers.HandleVehicleStateMulti)
// ### CARUPDATE ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/carupdates", handlers.HandleCarUpdatesGet)
addHandler(router, permissionUpdateDeploy.CopyAndMerge(magnaAccess), http.MethodPost, "/carupdate", handlers.HandleCarUpdatesAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/carupdate", handlers.HandleCarUpdateDelete)
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPost, "/carupdate/:id/cancel", handlers.HandleCarUpdateCancel)
addHandler(router, carDiagnostic, http.MethodPost, "/carupdate/:id/vehicle-cancel", handlers.HandleCarUpdateVehicleCancel)
addHandler(router, permissionUpdateDeploy.CopyAndMerge(magnaAccess), http.MethodPost, "/carupdate/:id/deploy", handlers.HandleCarUpdateDeploy)
// ### CARUPDATESLOG ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/carupdateslog", handlers.HandleCarUpdatesLog)
// ### CARUPDATESTATUS ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/carupdatesstatuses", handlers.HandleCarUpdatesStatuses)
// ### DASHBOARD ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/dashboard/guest-token", handlers.HandleDashboardToken)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/dashboard/embedded-dashboards", handlers.HandleSupersetEmbeddedDashboardsGet)
// ### DITTO ###
addHandler(router, permissionRead, http.MethodGet, "/ditto/carstate", handlers.HandleDigitalTwinSignal)
// ### DTC ###
addHandler(router, permissionRead, http.MethodGet, "/dtcs/:vin", handlers.HandleECUDTCGet)
// ### ECUSTATS ###
addHandler(router, permissionRead, http.MethodGet, "/ecu_stats", handlers.HandleECUStatsGetList)
addHandler(router, permissionRead, http.MethodGet, "/ecu_stats/:vin/:dbc", handlers.HandleVINECUStatsGetList)
// ### FLEET ###
addHandler(router, permissionRead, http.MethodGet, "/fleets", handlers.HandleFleetGetList)
addHandler(router, permissionCreate, http.MethodPost, "/fleet", handlers.HandleFleetAdd)
addHandler(router, permissionRead, http.MethodGet, "/fleet/:name", handlers.HandleFleetGet)
addHandler(router, permissionCreate, http.MethodPut, "/fleet/:name", handlers.HandleFleetUpdate)
addHandler(router, permissionDelete, http.MethodDelete, "/fleet/:name", handlers.HandleFleetDelete)
addHandler(router, permissionRead, http.MethodGet, "/fleet/:name/filters", handlers.HandleFleetFilterGetList)
addHandler(router, permissionCreate, http.MethodPost, "/fleet/:name/filter", handlers.HandleFleetFilterAdd)
addHandler(router, permissionCreate, http.MethodPut, "/fleet/:name/filter/:id", handlers.HandleFleetFilterUpdate)
addHandler(router, permissionDelete, http.MethodDelete, "/fleet/:name/filter/:id", handlers.HandleFleetFilterDelete)
addHandler(router, permissionRead, http.MethodGet, "/fleet/:name/vehicles", handlers.HandleFleetVehicleGetList)
addHandler(router, permissionRead, http.MethodPost, "/fleet/:name/vehicles/add", handlers.HandleFleetVehicleAdd)
addHandler(router, permissionRead, http.MethodPost, "/fleet/:name/vehicles/delete", handlers.HandleFleetVehicleDelete)
// ### FLEETUPDATE ###
addHandler(router, permissionCreate, http.MethodPost, "/fleetupdate", handlers.HandleFleetUpdatesAdd)
// ### ISSUE ###
addHandler(router, permissionRead, http.MethodGet, "/issues", handlers.HandleIssuesGet)
addHandler(router, permissionRead, http.MethodGet, "/issues/:id", handlers.HandleIssueGet)
addHandler(router, permissionDelete, http.MethodDelete, "/issues/:id", handlers.HandleIssuesDelete)
// ### MANIFEST ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/manifests", handlers.HandleUpdateManifestsGet)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/manifest", handlers.HandleUpdateManifestGet)
addHandler(router, permissionCreate, http.MethodPost, "/manifest", handlers.HandleUpdateManifestAdd)
addHandler(router, permissionCreate, http.MethodPut, "/manifest", handlers.HandleUpdateManifestUpdate)
addHandler(router, permissionDelete, http.MethodDelete, "/manifest", handlers.HandleUpdateManifestDelete)
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPut, "/manifests/:id/sums", handlers.HandleUpdateManifestSUMSUpdate)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/manifests/:manifest_id/vehicles", handlers.HandleGetCarsByManifest)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/manifest/sums", handlers.HandleUpdateManifestSUMSGet)
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPost, "/manifest/sums", handlers.HandleUpdateManifestSUMSAdd)
addHandler(router, permissionDelete.CopyAndMerge(magnaAccess), http.MethodDelete, "/manifest/sums/:version", handlers.HandleUpdateManifestSUMSDelete)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/manifest/sums/:version/rxswins", handlers.HandleUpdateManifestSUMSRxSwinsGet)
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPost, "/manifest/sums/:version/rxswins", handlers.HandleUpdateManifestSUMSRxSwinsAdd)
addHandler(router, permissionDelete.CopyAndMerge(magnaAccess), http.MethodDelete, "/manifest/sums/:version/rxswins/:rxswin", handlers.HandleUpdateManifestSUMSRxSwinsDelete)
// ### MANIFESTECU ###
addHandler(router, permissionCreate, http.MethodPost, "/manifestecu", handlers.HandleUpdateManifestECUAdd)
// ### MANIFESTFILE ###
addHandler(router, permissionCreate, http.MethodPost, "/manifestfile", handlers.HandleUpdateManifestFileAdd)
// ### MANIFESTMIGRATE ###
// Need a special permission
// Like HandleUpdateManifestAdd, but receives a manifest itself instead of the CreateUpdateManifest object
addHandler(router, permissionMigrate, http.MethodPost, "/manifestmigrate", handlers.HandleUpdateManifestMigrateReceive)
// Sends the manifest to another API
addHandler(router, permissionMigrate, http.MethodPost, "/manifestmigrate/:manifest_id", handlers.HandleUpdateManifestMigrate)
addHandler(router, permissionMigrate, http.MethodGet, "/manifestmigrate-version", handlers.HandleUpdateManifestMigrateVersion)
// ### MANUFACTURECERT ###
addHandler(router, permissionManufacture.CopyAndMerge(magnaAccess), http.MethodPost, "/manufacture-certs", handlers.HandleGetDLLManufactureCerts)
// ### SMS ###
addHandler(router, permissionCreate, http.MethodPost, "/sms", handlers.HandleSMSSend)
// ### SUBSCRIPTION ###
addHandler(router, permissionDelete, http.MethodDelete, "/subscription", handlers.HandleSubscriptionDelete)
// ### SUBSCRIPTIONCONFIG ###
addHandler(router, permissionRead, http.MethodGet, "/subscriptionconfigs", handlers.HandleSubscriptionConfigsGetList)
addHandler(router, permissionCreate, http.MethodPost, "/subscriptionconfig", handlers.HandleSubscriptionConfigAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/subscriptionconfig", handlers.HandleSubscriptionConfigDelete)
addHandler(router, permissionCreate, http.MethodPut, "/subscriptionconfig", handlers.HandleSubscriptionConfigUpdate)
// ### SUBSCRIPTIONFEATURE ###
addHandler(router, permissionRead, http.MethodGet, "/subscriptionfeatures", handlers.HandleSubscriptionFeaturesGet)
addHandler(router, permissionCreate, http.MethodPost, "/subscriptionfeature", handlers.HandleSubscriptionFeatureAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/subscriptionfeature", handlers.HandleSubscriptionFeatureDelete)
addHandler(router, permissionCreate, http.MethodPut, "/subscriptionfeature", handlers.HandleSubscriptionFeatureUpdate)
addHandler(router, permissionRead, http.MethodGet, "/subscriptionfeature", handlers.HandleSubscriptionFeatureGet)
// ### SUBSCRIPTIONPACKAGE ###
addHandler(router, permissionRead, http.MethodGet, "/subscriptionpackages", handlers.HandleSubscriptionPackagesGetList)
addHandler(router, permissionCreate, http.MethodPost, "/subscriptionpackage", handlers.HandleSubscriptionPackageAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/subscriptionpackage", handlers.HandleSubscriptionPackageDelete)
addHandler(router, permissionCreate, http.MethodPut, "/subscriptionpackage", handlers.HandleSubscriptionPackageUpdate)
addHandler(router, permissionRead, http.MethodGet, "/subscriptionpackage", handlers.HandleSubscriptionPackageGet)
// ### SUBSCRIPTIONPACKAGEFEATURE ###
addHandler(router, permissionCreate, http.MethodPost, "/subscriptionpackagefeature", handlers.HandleSubscriptionFeatureAssign)
// ### SUPPLIER ###
addHandler(router, permissionSupplierAdmin, http.MethodGet, "/suppliers", handlers.HandleSuppliersGetList)
addHandler(router, permissionSupplierAdmin, http.MethodPost, "/supplier/activate/:email", handlers.HandleSupplierActivate)
addHandler(router, permissionSupplierAdmin, http.MethodPut, "/supplier/:email", handlers.HandleSupplierUpdate)
addHandler(router, permissionSupplierAdmin, http.MethodDelete, "/supplier/:email", handlers.HandleSupplierDelete)
// ### TAG ###
addHandler(router, permissionCreate, http.MethodPut, "/tags", handlers.HandleTagsUpdate)
addHandler(router, permissionCreate, http.MethodPost, "/tags", handlers.HandleTagsAppend)
// ### VEHICLE ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicles", handlers.HandleVehiclesGet)
addHandler(router, permissionCreate, http.MethodPut, "/vehicles/archive", handlers.HandleUpdateManifestsArchive)
addHandler(router, permissionCreate, http.MethodPost, "/vehicle", handlers.HandleVehicleAdd)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicle/:vin", handlers.HandleVehicleGet)
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPut, "/vehicle/:vin", handlers.HandleVehicleUpdate)
addHandler(router, permissionDelete, http.MethodDelete, "/vehicle/:vin", handlers.HandleVehicleDeleteHoneyPot)
addHandler(router, permissionRead, http.MethodGet, "/vehicle/:vin/filters", handlers.HandleVehicleFilterGetList)
addHandler(router, permissionCreate, http.MethodPost, "/vehicle/:vin/filter", handlers.HandleVehicleFilterAdd)
addHandler(router, permissionCreate, http.MethodPut, "/vehicle/:vin/filter/:id", handlers.HandleVehicleFilterUpdate)
addHandler(router, permissionDelete, http.MethodDelete, "/vehicle/:vin/filter/:id", handlers.HandleVehicleFilterDelete)
addHandler(router, permissionRead, http.MethodGet, "/vehicle/:vin/fleets", handlers.HandleVehicleFleetGetList)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicle/:vin/trex-logs", handlers.HandleTrexLogsGet)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicle/:vin/trex-logs-link", handlers.HandleTrexLogsLinkGet)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicle/:vin/version", handlers.HandleVersionsGet)
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicle/:vin/version/logs", handlers.HandleVersionLogsGet)
// ### VEHICLECOMMAND ###
addHandler(router, permissionCreate.CopyAndMerge(magnaAccess), http.MethodPost, "/vehiclecommand", handlers.HandleVehicleCommand)
// immobilizer routes
addHandler(router, permissionCreate, http.MethodGet, "/vehiclecommand/immobilize", handlers.HandleVehicleImmobilizerList)
addHandler(router, permissionCreate, http.MethodPost, "/vehiclecommand/immobilize", handlers.HandleVehicleImmobilizerAdd)
addHandler(router, permissionCreate, http.MethodDelete, "/vehiclecommand/immobilize", handlers.HandleVehicleImmobilizerDelete)
// ### VEHICLEDIAGNOSTICCOMMAND ###
addHandler(router, carDiagnostic, http.MethodPost, "/vehiclediagnosticcommand", handlers.HandleVehicleDiagnosticCommand)
// ### VEHICLEECU ###
addHandler(router, permissionRead.CopyAndMerge(magnaAccess), http.MethodGet, "/vehicleecus", handlers.HandleVehicleECUsGet)
// ### VEHICLEMODEL ###
addHandler(router, permissionRead, http.MethodGet, "/vehiclemodels", handlers.HandleVehicleModels)
// ### FLASHPACK TO ECU VERSION MAPPINGS ###
addHandler(router, permissionRead, http.MethodGet, "/flashpack_version_ecu_mappings/:model/:trim/:year/:flashpack", handlers.HandleFlashpackVersionECUMappingsGet)
addHandler(router, permissionRead, http.MethodGet, "/flashpack_versions/:model/:trim/:year", handlers.HandleFlashpackVersionsGetAll)
addHandler(router, permissionCreate, http.MethodPost, "/flashpack_version", handlers.HandleFlashpackVersionAdd)
addHandler(router, permissionDelete, http.MethodDelete, "/flashpack_version", handlers.HandleFlashpackVersionDelete)
addHandler(router, permissionRead, http.MethodGet, "/flashpack_version_info/:vin", handlers.HandleFlashpackVersionInfoGet)
// ### VEHICLEPATH ###
addHandler(router, permissionRead, http.MethodPost, "/vehicle_paths", handlers.HandleVehiclePathsPost)
// ### VEHICLEYEAR ###
addHandler(router, permissionRead, http.MethodGet, "/vehicleyears", handlers.HandleVehicleYears)
// ### CUSTOMER EMAILS ###
addHandler(router, permissionRead, http.MethodPut, "/customer_ota_emails", handlers.HandleCustomerOtaEmails)
// ### OVLoop Data Sources ###
addHandler(router, permissionRead, http.MethodGet, "/cars/allowed_access", handlers.HandleCarsAllowedAccess)
addHandler(router, permissionRead, http.MethodPost, "/cars/allowed_access", handlers.HandleCarAllowedAccess)
addHandler(router, permissionCreate, http.MethodPost, "/cars/change_access", handlers.HandleCarChangeAccess)
addHandler(router, permissionCreate, http.MethodGet, "/cars/hmi_key", handlers.HandleGetCarsHMIKey)
addHandler(router, permissionCreate, http.MethodPost, "/drivers/add_external", handlers.HandleVehicleExternalDriverAdd)
addHandler(router, permissionCreate, http.MethodDelete, "/drivers/delete_external", handlers.HandleExternalDriverDelete)
addHandler(router, permissionRead, http.MethodGet, "/car/software_information", handlers.HandleCarSoftwareInformation)
addHandler(router, permissionRead, http.MethodGet, "/car/software_information/v2", handlers.HandleCarSoftwareInformationV2)
addHandler(router, permissionRead, http.MethodPost, "/car/wake", handlers.HandleSendWakeSMSToVIN)
// Experimental text feature
addHandler(router, nil, http.MethodGet, "/expirment", handlers.HandleExperiment)
go controllers.HealthCheck()
logger.Info().Msgf("Listening on http://0.0.0.0%s", port)
logger.Fatal().Err(http.ListenAndServe(port, router)).Send()
}
func addHandler(router *httprouter.Router, roles a.RoleMap, method string, path string, handler http.HandlerFunc) {
router.HandlerFunc(method, h.HttpRouterHandleBaseURL(path), authChecker.GetHandler(roles, h.LogRequest(handler)))
}
func cleanup() {
authChecker.Close()
services.GetDB().Close()
logger.Close()
}