diff --git a/.gitignore b/.gitignore index b7446d9..68e722a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,8 @@ version **/appmgr 0.3.0_features.md **/embassy-sdk -start9-registry.prof \ No newline at end of file +start9-registry.prof +start9-registry.hp +start9-registry.pdf +start9-registry.aux +start9-registry.ps \ No newline at end of file diff --git a/config/settings.yml b/config/settings.yml index c1106d7..d622f8b 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -13,7 +13,7 @@ ip-from-header: "_env:YESOD_IP_FROM_HEADER:false" # By default, `yesod devel` runs in development, and built executables use # production settings (see below). To override this, use the following: # -# development: false +development: true # Optional values with the following production defaults. # In development, they default to the inverse. diff --git a/src/Handler/Marketplace.hs b/src/Handler/Marketplace.hs index 193a893..ccd3743 100644 --- a/src/Handler/Marketplace.hs +++ b/src/Handler/Marketplace.hs @@ -287,7 +287,7 @@ getPackageListR = do query let filteredServices' = sAppAppId . entityVal <$> filteredServices settings <- getsYesod appSettings - packageMetadata <- time "metadata" $ runDB $ fetchPackageMetadata filteredServices' + packageMetadata <- time "metadata" $ runDB $ fetchPackageMetadata $ Just filteredServices' $logInfo $ show packageMetadata serviceDetailResult <- time "service details" $ liftIO $ mapConcurrently (getServiceDetails settings packageMetadata Nothing) @@ -303,12 +303,10 @@ getPackageListR = do Right (packages :: [PackageVersion]) -> do -- for each item in list get best available from version range settings <- getsYesod appSettings - availableServicesResult <- time "availableServicesResult" $ liftIO $ mapConcurrently - (getPackageDetails settings) - packages -- @TODO fix _ error + packageMetadata <- time "metadata2" $ runDB $ fetchPackageMetadata Nothing + availableServicesResult <- traverse (getPackageDetails packageMetadata) packages let (_, availableServices) = partitionEithers availableServicesResult - packageMetadata <- time "metadata2" $ runDB $ fetchPackageMetadata (snd <$> availableServices) serviceDetailResult <- time "service details 2" $ liftIO $ mapConcurrently (uncurry $ getServiceDetails settings packageMetadata) availableServices @@ -328,22 +326,18 @@ getPackageListR = do where - getPackageDetails :: (MonadIO m) - => AppSettings - -> PackageVersion - -> m (Either Text ((Maybe Version), AppIdentifier)) - getPackageDetails settings pv = do - let appId = packageVersionId pv - let spec = packageVersionVersion pv - let appExt = Extension (show appId) :: Extension "s9pk" - time "best version" $ getBestVersion (( "apps") . resourcesDir $ settings) appExt spec >>= \case - Nothing -> - pure - $ Left - $ "best version could not be found for " - <> show appId - <> " with spec " - <> show spec + getPackageDetails :: MonadIO m => (HM.HashMap AppIdentifier ([Version], [CategoryTitle])) -> PackageVersion -> m (Either Text ((Maybe Version), AppIdentifier)) + getPackageDetails metadata pv = do + let appId = packageVersionId pv + let spec = packageVersionVersion pv + pacakgeMetadata <- case HM.lookup appId metadata of + Nothing-> throwIO $ NotFoundE [i|dependency metadata for #{appId} not found.|] + Just m -> pure m + -- get best version from VersionRange of dependency + let satisfactory = filter (<|| spec) (fst pacakgeMetadata) + let best = getMax <$> foldMap (Just . Max) satisfactory + case best of + Nothing -> pure $ Left $ "best version could not be found for " <> show appId <> " with spec " <> show spec Just v -> do pure $ Right (Just v, appId) @@ -478,7 +472,7 @@ fetchLatestAppAtVersion appId version' = selectOne $ do pure (service, version) fetchPackageMetadata :: MonadUnliftIO m - => [AppIdentifier] + => Maybe [AppIdentifier] -> ReaderT SqlBackend m (HM.HashMap AppIdentifier ([Version], [CategoryTitle])) fetchPackageMetadata ids = do let categoriesQuery = select $ do