예제 #1
0
    def post(self, accountId):
        data = request.get_json()
        print(json.dumps(data, indent=4, sort_keys=True))

        #   Verifying required data is available to proccess request
        if not data or not data.get("appDetails") or not data.get(
                "accountDetails") or not data.get("carDetails"):
            return res.badRequestError("Missing data to process request.")
        dataAppDetails = data.get("appDetails")
        dataAppVersionDetails = dataAppDetails["appversionDetails"]
        dataAccountDetails = data.get("accountDetails")
        dataCarDetails = data.get("carDetails")
        if not dataAppDetails or not dataAppVersionDetails or not dataAccountDetails or not dataCarDetails:
            return res.badRequestError("Missing data to process request.")

        #   Finding requested app package in server
        appReqDownloadPath = os.path.join(
            app.config["UPLOAD_FOLDER"],
            os.path.join(dataAppDetails["appname"],
                         dataAppVersionDetails["version"]))
        if os.path.exists(appReqDownloadPath) == False:
            print("wrong path")
            return res.badRequestError("App executable files not found.")

        #   Saves customer download request
        apprequestDetails = {
            "requesttype": 3,
            "appversion": dataAppVersionDetails["id"],
            "customer": accountId,
            "car": dataCarDetails["id"]
        }
        customerAppRequest, error = apprequest_schema.load(apprequestDetails)
        if error:
            return res.internalServiceError(error)
        customerAppRequest.status = 5  # sets status as download request
        db.session.add(customerAppRequest)
        db.session.commit()

        #   Connect to client vehicle device
        remoteAppDirectory = os.path.join(app.config["PI_REMOTE_DIR"],
                                          dataAppDetails["appname"])
        error, sshI = ssh.SSHconnect(app.config["PI_IP"], 22)
        if error < 0:
            return res.internalServiceError(sshI)

        #   Download and Install app in remote device
        ssh.createAppDirectory(sshI, remoteAppDirectory)
        ssh.sendFile(sshI, appReqDownloadPath,
                     os.path.join(remoteAppDirectory, "App.zip"))
        ssh.installApp(sshI, remoteAppDirectory, "helloworld.py")
        print(sshI)

        return res.postSuccess("App installation successful.")
예제 #2
0
 def get(self, accountId):
     queryDeveloperApp = ApplicationDeveloper.query.filter_by(
         accountid=accountId).all()
     if not queryDeveloperApp:
         return res.resourceMissing(
             "No apps for developer with account {} found.".format(
                 accountId))
     developerapps, error = applicationdevelopers_schema.dump(
         queryDeveloperApp)
     if error:
         return res.internalServiceError(error)
     allapps = []
     for developerapp in developerapps:
         queryApplication = Application.query.filter(
             Application.id == developerapp["appid"]).filter(
                 or_(
                     Application.active == True,
                     and_(Application.active == False,
                          Application.runningversion == 0))).first()
         if queryApplication:
             queryAppVersion = ApplicationVersion.query.filter(
                 ApplicationVersion.app == queryApplication.id).first()
             developerapp["appDetails"] = application_schema.dump(
                 queryApplication).data
             if queryAppVersion:
                 developerapp["appDetails"][
                     "appversionDetails"] = applicationversion_schema.dump(
                         queryAppVersion).data
             allapps.append(developerapp)
     return res.getSuccess(data=allapps)
예제 #3
0
    def post(self, accountId):
        data = request.get_json()

        #   Verifying data required for endpoint was given
        if not data or not data.get("vinNumber"):
            return res.badRequestError("Missing data to process request.")

        #   Verifying car given exists in database
        queryCar = Car.query.filter_by(vin=data.get("vinNumber")).first()
        if not queryCar:
            return res.resourceMissing("Car {} does not exist.".format(
                data.get("vinNumber")))

        #   Verifying car given is NOT registered under the given customer
        queryCarUser = CarUser.query.filter_by(car=queryCar.id,
                                               account=accountId).first()
        if queryCarUser:
            return res.resourceExistsError(
                "Car already registered under customer {}.".format(accountId))

        #   Creata the link from user to the registered car in the database
        newCarUserDetails = {"car": queryCar.id, "account": accountId}
        newCarUser, error = caruser_schema.load(newCarUserDetails)
        if error:
            return res.internalServiceError(error)
        db.session.add(newCarUser)
        db.session.commit()
        return res.postSuccess("Car {} registered under customer {}.".format(
            data.get("vinNumber"), accountId))
예제 #4
0
    def put(self):
        #print(request.files)
        data = request.form
        print(data)
        if not data or not data["requestId"] or not data["status"] or not data[
                "appDetail"]:
            return res.badRequestError("Missing data to process request.")

        #   Validate app path exists
        appDetail = data["appDetail"]
        appDetail = appDetail.replace('-', '/')
        logStoragePath = os.path.join(app.config['UPLOAD_FOLDER'], appDetail)
        if os.path.exists(logStoragePath) == False:
            return res.internalServiceError(
                "No directory found for {}.".format(appDetail))

        queryAppRequest = AppRequest.query.filter_by(
            id=data["requestId"]).first()
        if not queryAppRequest:
            return res.badRequestError("Request {} does not exist.".format(
                data["requestId"]))

        #   Call application service to update application version status
        if (int(data.get("status")) == 2):
            status = 4
        else:
            status = 3
        AppServiceReq = requests.put(
            app.config['APPLICATION_SERVICE'] +
            "{}/appversion".format(queryAppRequest.appversion),
            json={
                "status": status
            }).json()
        if ("success" not in AppServiceReq["status"]):
            return res.internalServiceError(
                "Error in application service. Is it running?")

        #   Saves log file
        saved, msg = ServUtil.saveLoginServer(app, request.files["logfile"],
                                              logStoragePath)
        if not saved:
            return res.internalServiceError(msg)

        queryAppRequest.status = data["status"]
        db.session.commit()
        return res.putSuccess(
            data=apprequest_schema.dump(queryAppRequest).data)
예제 #5
0
 def get(self, developerId):
     query = AppRequest.query.filter_by(developer=developerId).all()
     if not query:
         return res.getSuccess(data=None)
     developerrequests, error = apprequests_schema.dump(query)
     if error:
         return res.internalServiceError(error)
     return res.getSuccess(
         "Requests made by developer {} retrieved".format(developerId),
         developerrequests)
예제 #6
0
 def get(self, appversionId):
     queryRequests = AppRequest.query.filter_by(
         appversion=appversionId).all()
     if not queryRequests:
         return res.getSuccess(data=None)
     apprequests, error = apprequests_schema.dump(queryRequests)
     if error:
         return res.internalServiceError(error)
     return res.getSuccess(
         "Requests for app {} retrieved".format(appversionId), apprequests)
예제 #7
0
 def get(self):
     queryApps = Application.query.filter_by(active=True).all()
     print(queryApps)
     if not queryApps:
         return res.resourceMissing("No apps in AppStore yet. Brah!")
     apps, error = applications_schema.dump(queryApps)
     if error:
         return res.internalServiceError(error)
     for a in apps:
         queryAppVersion = ApplicationVersion.query.filter_by(
             id=a["runningversion"]).first()
         a["appversionDetails"] = applicationversion_schema.dump(
             queryAppVersion).data
     return res.getSuccess(data=apps)
예제 #8
0
 def get(self, appversionId):
     queryAppVersion = ApplicationVersion.query.filter_by(
         id=appversionId).first()
     if not queryAppVersion:
         return res.resourceMissing(
             "No version record {} exists.".format(appversionId))
     appVersion, error = applicationversion_schema.dump(queryAppVersion)
     if error:
         return res.internalServiceError(error)
     queryApp = Application.query.filter_by(id=queryAppVersion.app).first()
     if not queryApp:
         return res.resourceMissing("App {} does not exist.".format(
             queryAppVersion.app))
     appVersion["appDetails"] = application_schema.dump(queryApp).data
     return res.getSuccess(data=appVersion)
예제 #9
0
 def post(self):
     data = request.get_json()
     if not data or not data.get("firstname") or not data.get("lastname") or not data.get("username") or not data.get("password"):
         return res.badRequestError("Missing information to process account creation.")
     #   check username is unique
     query = Account.query.filter_by(username=data.get("username")).first()
     if query:
         return res.resourceExistsError("Username {} already taken.".format(data.get("username")))
     
     newAccountDetails = {"firstname": data.get("firstname"), "lastname": data.get("lastname"), "username": data.get("username"), "password": data.get("password") }
     newAccount, error = account_schema.load(newAccountDetails)
     if error:
         return res.internalServiceError(error)
     db.session.add(newAccount)
     db.session.commit()
     return res.postSuccess("Account succesfully created for username {}.".format(newAccount.username), account_schema.dump(newAccount).data)
예제 #10
0
    def get(self, accountId):
        appRequestServ = requests.get(app.config['APPREQUEST_SERVICE'] +
                                      "customer/{}".format(accountId)).json()
        print(json.dumps(appRequestServ))
        if "success" not in appRequestServ["status"]:
            return res.internalServiceError("Sorry :(")
        allRequests = appRequestServ["data"]
        applications = []
        for req in allRequests:
            queryAppVersion = ApplicationVersion.query.filter_by(
                id=req["appversion"]).first()
            queryApp = Application.query.filter_by(
                id=queryAppVersion.app).first()
            thisapp = application_schema.dump(queryApp).data
            thisapp["appversionDetails"] = applicationversion_schema.dump(
                queryAppVersion).data
            applications.append(thisapp)

        return res.getSuccess(data=applications)
예제 #11
0
    def post(self):
        data = request.get_json()
        print(request.files)
        print(data)
        if not data or not data.get("accountId") or not data.get(
                "author") or not data.get("appName"):
            return res.badRequestError("Missing data to process request")

        #   Checks if app name already exists
        query = Application.query.filter_by(
            appname=data.get('appName')).first()
        if query is not None:
            return res.resourceExistsError("App name {} already taken".format(
                data.get('appName')))

        #   Validates and saves app data given
        appDetails = {
            "appname": data.get('appName'),
            "author": data.get("author"),
            "description": data.get('appDescription')
        }
        newApp, error = application_schema.load(appDetails)
        if error:
            return res.badRequestError(error)
        db.session.add(newApp)
        db.session.commit()

        #   Create app directory
        ServUtil.createAppDir(
            os.path.join(app.config["UPLOAD_FOLDER"], newApp.appname))

        #   Add permission to developer over created application
        linked, msg = ServUtil.addDevelopertoApp(
            db, {
                "appid": newApp.id,
                "accountid": data.get("accountId")
            })
        if not linked:
            return res.internalServiceError(msg)

        return res.postSuccess(
            "Succesfully created application {}.".format(newApp.appname),
            application_schema.dump(newApp).data)
예제 #12
0
    def get(self, caruserId):
        queryCarUser = CarUser.query.filter_by(id=caruserId).first()

        #   Verifies car and customer registration exists
        if not queryCarUser:
            return res.resourceMissing("No data found for car registration.")

        queryCar = Car.query.filter_by(id=queryCarUser.car).first()

        #   Verifies car type data is available on database
        #   (if fails this is an internal error, because data from model was deleted from database)
        if not queryCar:
            return res.resourceMissing("No data found for car type {}.".format(
                queryCarUser.car))

        caruser, error = caruser_schema.dump(queryCarUser)
        if error:
            return res.internalServiceError(error)
        caruser["cardetails"] = car_schema.dump(queryCar).data
        return res.getSuccess(
            "Succesfully retrieved data for customer car registered.", caruser)
예제 #13
0
 def post(self):
     data = request.get_json()
     #print(data)
     if not data or not data.get("versionNumber") or not data.get(
             "checksum") or not data.get("accountId") or not data.get(
                 "appversionId") or not data.get(
                     "requestType") or not data.get("appName"):
         return res.badRequestError("Missing data to create app request")
     requestDetails = {
         "developer": data.get("accountId"),
         "appversion": data.get("appversionId"),
         "requesttype": data.get("requestType")
     }
     appRequest, error = apprequest_schema.load(requestDetails)
     print(appRequest)
     if error:
         return res.internalServiceError(error)
     db.session.add(appRequest)
     db.session.commit()
     kabascript = "/nfs/2017/d/dmontoya/42/fordappstore/infrastructure/containers/raspbian/kabascriptest.sh"  # using test kaba for nows
     #   sh run.sh App.zip ya-ya b7709364cb0e7a86416f17fa3ff35b903077e8fa9e94c7e580ad7d57d5a6d509 1
     appName = data.get("appName")
     appName = appName.replace(' ', '\ ')
     appZipPath = os.path.join(app.config["UPLOAD_FOLDER"], appName,
                               data.get("versionNumber"), "App.zip")
     appandversion = "{}-{}".format(data.get("appName"),
                                    data.get("versionNumber"))
     print(data.get("checksum"))
     print(kabascript)
     print(appandversion)
     print(appZipPath)
     print(str(appRequest.id))
     subprocess.call([
         "sh", kabascript, appZipPath, appandversion,
         data.get("checksum"),
         str(appRequest.id)
     ])
     return res.postSuccess("Request succesfully created.",
                            apprequest_schema.dump(appRequest).data)
예제 #14
0
 def get(self, accountId):
     queryCarUser = CarUser.query.filter_by(account=accountId).all()
     if not queryCarUser:
         return res.resourceMissing(
             "No cars registered under account {}.".format(accountId))
     usercars, error = carusers_schema.dump(queryCarUser)
     if error:
         return res.internalServiceError(error)
     customerCars = []
     for usercar in usercars:
         car = Car.query.filter_by(id=usercar["car"]).first()
         if not car:
             return res.resourceMissing("No data found for car {}.".format(
                 usercar["car"]))
         usercar["carDetails"] = car_schema.dump(car).data
         queryCarModel = CarModel.query.filter_by(id=car.carmodel).first()
         if queryCarModel:
             usercar["carDetails"][
                 "carmodelDetails"] = carmodel_schema.dump(
                     queryCarModel).data
         customerCars.append(usercar)
     return res.getSuccess(
         "Cars registered under account {}.".format(accountId),
         customerCars)
예제 #15
0
    def post(self, appId):
        data = request.form
        print(data)
        print(request.files)

        #   Verifies data required was sent in request
        if not data or not data.get("appName") or not data.get(
                "versionNumber") or not data.get("checksum") or not data.get(
                    "versionDescription"):
            return res.badRequestError("Missing data to process request.")

        #   Verifies app version file was sent in request
        if 'file' not in request.files:
            return res.badRequestError("Missing app file.")
        file = request.files['file']

        if "icon" not in request.files:
            return res.badRequestError("Send me an icon.")
        icon = request.files['icon']
        iconPath = os.path.join(app.config["UPLOAD_FOLDER"],
                                data.get("appName"), "Icon")
        print(iconPath)
        saved, msg = ServUtil.saveIcon(icon, iconPath)
        if not saved:
            return res.internalServiceError(msg)

        checksum = ServUtil.checksum_sha256(file)

        if data.get("checksum") == checksum:
            print("good checksum")
        else:
            return res.badRequestError("File corrupted.")
        file.seek(0)
        #   Verifies app exists
        queryApp = Application.query.filter_by(id=appId).first()
        if not queryApp:
            return res.resourceMissing("App {} not found.".format(appId))

        queryAppVersion = ApplicationVersion.query.filter_by(
            app=appId, version=data.get("versionNumber")).first()
        if queryAppVersion:
            return res.resourceExistsError(
                "Duplicate {} v.{} has already been submitted for review.".
                format(queryApp.appname, queryAppVersion.version))

        #   Validates data and creates application version
        appVersionDetails = {
            "app": appId,
            "version": data.get("versionNumber"),
            "description": data.get("versionDescription")
        }
        newappVersion, error = applicationversion_schema.load(
            appVersionDetails)
        if error:
            return res.internalServiceError(error)
        db.session.add(newappVersion)
        db.session.commit()

        #   Saves version files
        saved, msg = ServUtil.saveinAppVersion(app, file, data)
        if not saved:
            return res.internalServiceError(message=msg)

        return res.postSuccess(
            "{} v.{} successfully created !".format(queryApp.appname,
                                                    newappVersion.version),
            applicationversion_schema.dump(newappVersion).data)