blob: cf2e2cf6a0051b670f67b8bb1af802329676ab37 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package frontend
import (
"fmt"
"net/http"
"golang.org/x/pkgsite/internal"
"golang.org/x/pkgsite/internal/licenses"
"golang.org/x/pkgsite/internal/postgres"
)
// legacyFetchDetailsForModule returns tab details by delegating to the correct detail
// handler.
func legacyFetchDetailsForModule(r *http.Request, tab string, ds internal.DataSource, mi *internal.ModuleInfo, licenses []*licenses.License, readme *internal.Readme) (interface{}, error) {
ctx := r.Context()
switch tab {
case "packages":
return legacyFetchDirectoryDetails(ctx, ds, mi.ModulePath, mi, licensesToMetadatas(licenses), true)
case tabLicenses:
return &LicensesDetails{Licenses: transformLicenses(mi.ModulePath, mi.Version, licenses)}, nil
case tabVersions:
return fetchModuleVersionsDetails(ctx, ds, mi.ModulePath)
case tabOverview:
return constructOverviewDetails(ctx, mi, readme, mi.IsRedistributable, urlIsVersioned(r.URL))
}
return nil, fmt.Errorf("BUG: unable to fetch details: unknown tab %q", tab)
}
// legacyFetchDetailsForDirectory returns tab details by delegating to the correct
// detail handler.
func legacyFetchDetailsForDirectory(r *http.Request, tab string, dir *internal.LegacyDirectory, licenses []*licenses.License) (interface{}, error) {
switch tab {
case tabOverview:
readme := &internal.Readme{Filepath: dir.LegacyReadmeFilePath, Contents: dir.LegacyReadmeContents}
return constructOverviewDetails(r.Context(), &dir.ModuleInfo, readme, dir.LegacyModuleInfo.IsRedistributable, urlIsVersioned(r.URL))
case tabSubdirectories:
// Ideally we would just use fetchDirectoryDetails here so that it
// follows the same code path as fetchDetailsForModule and
// fetchDetailsForPackage. However, since we already have the directory
// and licenses info, it doesn't make sense to call
// postgres.GetUnit again.
return legacyCreateDirectory(dir, licensesToMetadatas(licenses), false)
case tabLicenses:
return &LicensesDetails{Licenses: transformLicenses(dir.ModulePath, dir.Version, licenses)}, nil
}
return nil, fmt.Errorf("BUG: unable to fetch details: unknown tab %q", tab)
}
// legacyFetchDetailsForPackage returns tab details by delegating to the correct detail
// handler.
func legacyFetchDetailsForPackage(r *http.Request, tab string, ds internal.DataSource, pkg *internal.LegacyVersionedPackage) (interface{}, error) {
ctx := r.Context()
switch tab {
case tabDoc:
return legacyFetchDocumentationDetails(pkg), nil
case tabVersions:
return legacyFetchPackageVersionsDetails(ctx, ds, pkg.Path, pkg.V1Path, pkg.ModulePath)
case tabSubdirectories:
return legacyFetchDirectoryDetails(ctx, ds, pkg.Path, &pkg.ModuleInfo, pkg.Licenses, false)
case tabImports:
return fetchImportsDetails(ctx, ds, pkg.Path, pkg.ModulePath, pkg.Version)
case tabImportedBy:
db, ok := ds.(*postgres.DB)
if !ok {
// The proxydatasource does not support the imported by page.
return nil, proxydatasourceNotSupportedErr()
}
return fetchImportedByDetails(ctx, db, pkg.Path, pkg.ModulePath)
case tabLicenses:
return legacyFetchPackageLicensesDetails(ctx, ds, pkg.Path, pkg.ModulePath, pkg.Version)
case tabOverview:
return legacyFetchPackageOverviewDetails(ctx, pkg, urlIsVersioned(r.URL))
}
return nil, fmt.Errorf("BUG: unable to fetch details: unknown tab %q", tab)
}