internal/frontend: add NestedModules field to Directory struct

This change adds NestedModules to the directory struct in order to later
render the data in the subdirectories page of a package. We also modify
the createDirectory function to take in a nestedModules parameter.

Updates golang/go#38596

Change-Id: I9bcfc1f2aa37ac0b03b5def4b237473310690af6
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/254018
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/frontend/directory.go b/internal/frontend/directory.go
index 7450401..f3adc1d 100644
--- a/internal/frontend/directory.go
+++ b/internal/frontend/directory.go
@@ -34,7 +34,8 @@
 // Directory contains information for an individual directory.
 type Directory struct {
 	DirectoryHeader
-	Packages []*Package
+	Packages      []*Package
+	NestedModules []*internal.ModuleInfo
 }
 
 // serveDirectoryPage serves a directory view for a directory in a module
@@ -110,7 +111,11 @@
 		header := createDirectoryHeader(um.Path, mi, um.Licenses)
 		return &Directory{DirectoryHeader: *header}, nil
 	}
-	return createDirectory(um.Path, mi, u.Subdirectories, um.Licenses, includeDirPath)
+	nestedModules, err := ds.GetNestedModules(ctx, um.Path)
+	if err != nil {
+		return nil, err
+	}
+	return createDirectory(um.Path, mi, u.Subdirectories, nestedModules, um.Licenses, includeDirPath)
 }
 
 // createDirectory constructs a *Directory for the given dirPath.
@@ -122,7 +127,7 @@
 // the module path. However, on the package and directory view's
 // "Subdirectories" tab, we do not want to include packages whose import paths
 // are the same as the dirPath.
-func createDirectory(dirPath string, mi *internal.ModuleInfo, pkgMetas []*internal.PackageMeta,
+func createDirectory(dirPath string, mi *internal.ModuleInfo, pkgMetas []*internal.PackageMeta, nestedModules []*internal.ModuleInfo,
 	licmetas []*licenses.Metadata, includeDirPath bool) (_ *Directory, err error) {
 	var packages []*Package
 	for _, pm := range pkgMetas {
@@ -146,6 +151,7 @@
 	return &Directory{
 		DirectoryHeader: *header,
 		Packages:        packages,
+		NestedModules:   nestedModules,
 	}, nil
 }
 
diff --git a/internal/frontend/directory_test.go b/internal/frontend/directory_test.go
index ef69392..71256fe 100644
--- a/internal/frontend/directory_test.go
+++ b/internal/frontend/directory_test.go
@@ -57,7 +57,8 @@
 				Path:   dirPath,
 				URL:    constructDirectoryURL(dirPath, mi.ModulePath, linkVersion(mi.Version, mi.ModulePath)),
 			},
-			Packages: wantPkgs,
+			Packages:      wantPkgs,
+			NestedModules: nil,
 		}
 		if diff := cmp.Diff(want, got, cmp.AllowUnexported(safehtml.Identifier{})); diff != "" {
 			t.Errorf("fetchDirectoryDetails(ctx, %q, %q, %q) mismatch (-want +got):\n%s", dirPath, modulePath, version, diff)
diff --git a/internal/frontend/legacy_directory.go b/internal/frontend/legacy_directory.go
index ed380fa..0bf18d6 100644
--- a/internal/frontend/legacy_directory.go
+++ b/internal/frontend/legacy_directory.go
@@ -66,5 +66,5 @@
 		newPkg := packageMetaFromLegacyPackage(pkg)
 		packages = append(packages, newPkg)
 	}
-	return createDirectory(dbDir.Path, &dbDir.ModuleInfo, packages, licmetas, includeDirPath)
+	return createDirectory(dbDir.Path, &dbDir.ModuleInfo, packages, nil, licmetas, includeDirPath)
 }