11package database
22
33import (
4- "context"
54 "encoding/json"
65 "fmt"
76 "log"
87 "os"
98 "path/filepath"
10- "time"
119
1210 "github.com/modelcontextprotocol/registry/internal/model"
13- "go.mongodb.org/mongo-driver/bson"
14- "go.mongodb.org/mongo-driver/mongo"
15- "go.mongodb.org/mongo-driver/mongo/options"
1611)
1712
18- // ImportSeedFile populates the MongoDB database with initial data from a seed file.
19- func ImportSeedFile (mongo * MongoDB , seedFilePath string ) error {
13+ // ReadSeedFile reads and parses the seed.json file - exported for use by all database implementations
14+ func ReadSeedFile (path string ) ([]model.ServerDetail , error ) {
15+ log .Printf ("Reading seed file from %s" , path )
16+
2017 // Set default seed file path if not provided
21- if seedFilePath == "" {
18+ if path == "" {
2219 // Try to find the seed.json in the data directory
23- seedFilePath = filepath .Join ("data" , "seed.json" )
24- if _ , err := os .Stat (seedFilePath ); os .IsNotExist (err ) {
25- return fmt .Errorf ("seed file not found at %s" , seedFilePath )
20+ path = filepath .Join ("data" , "seed.json" )
21+ if _ , err := os .Stat (path ); os .IsNotExist (err ) {
22+ return nil , fmt .Errorf ("seed file not found at %s" , path )
2623 }
2724 }
2825
29- // Create a context with timeout for the database operations
30- ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Minute )
31- defer cancel ()
32-
33- // Read the seed file
34- seedData , err := readSeedFile (seedFilePath )
35- if err != nil {
36- return fmt .Errorf ("failed to read seed file: %w" , err )
37- }
38-
39- collection := mongo .collection
40- importData (ctx , collection , seedData )
41- return nil
42- }
43-
44- // readSeedFile reads and parses the seed.json file
45- func readSeedFile (path string ) ([]model.ServerDetail , error ) {
46- log .Printf ("Reading seed file from %s" , path )
47-
4826 // Read the file content
4927 fileContent , err := os .ReadFile (path )
5028 if err != nil {
@@ -64,44 +42,3 @@ func readSeedFile(path string) ([]model.ServerDetail, error) {
6442 log .Printf ("Found %d server entries in seed file" , len (servers ))
6543 return servers , nil
6644}
67-
68- // importData imports the seed data into MongoDB
69- func importData (ctx context.Context , collection * mongo.Collection , servers []model.ServerDetail ) {
70- log .Printf ("Importing %d servers into collection %s" , len (servers ), collection .Name ())
71-
72- for i , server := range servers {
73- if server .ID == "" || server .Name == "" {
74- log .Printf ("Skipping server %d: ID or Name is empty" , i + 1 )
75- continue
76- }
77- // Create filter based on server ID
78- filter := bson.M {"id" : server .ID }
79-
80- if server .VersionDetail .Version == "" {
81- server .VersionDetail .Version = "0.0.1-seed"
82- server .VersionDetail .ReleaseDate = time .Now ().Format (time .RFC3339 )
83- server .VersionDetail .IsLatest = true
84- }
85- // Create update document
86- update := bson.M {"$set" : server }
87-
88- // Use upsert to create if not exists or update if exists
89- opts := options .Update ().SetUpsert (true )
90- result , err := collection .UpdateOne (ctx , filter , update , opts )
91- if err != nil {
92- log .Printf ("Error importing server %s: %v" , server .ID , err )
93- continue
94- }
95-
96- switch {
97- case result .UpsertedCount > 0 :
98- log .Printf ("[%d/%d] Created server: %s" , i + 1 , len (servers ), server .Name )
99- case result .ModifiedCount > 0 :
100- log .Printf ("[%d/%d] Updated server: %s" , i + 1 , len (servers ), server .Name )
101- default :
102- log .Printf ("[%d/%d] Server already up to date: %s" , i + 1 , len (servers ), server .Name )
103- }
104- }
105-
106- log .Println ("Import completed successfully" )
107- }
0 commit comments