-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmigration.py
More file actions
124 lines (100 loc) · 4.44 KB
/
Copy pathmigration.py
File metadata and controls
124 lines (100 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from google.api_core.exceptions import NotFound
from google.cloud import firestore, storage
# Set up Firestore clients
prod_db = firestore.Client(project="pecha-backend")
dev_db = firestore.Client(project="pecha-backend-dev")
# Set up Storage clients
prod_storage = storage.Client(project="pecha-backend")
dev_storage = storage.Client(project="pecha-backend-dev")
# Replace with actual bucket names
prod_bucket_name = "your-prod-bucket-name"
dev_bucket_name = "your-dev-bucket-name"
def migrate_metadata():
metadata_collection = dev_db.collection("metadata")
for doc in metadata_collection.stream():
data = doc.to_dict()
# Transform the old schema fields to new schema
if "commentary_of" in data and data["commentary_of"]:
data["parent"] = data["commentary_of"]
data["type"] = "commentary"
# Remove old field
del data["commentary_of"]
elif "translation_of" in data and data["translation_of"]:
data["parent"] = data["translation_of"]
data["type"] = "translation"
# Remove old field
del data["translation_of"]
elif "version_of" in data and data["version_of"]:
data["parent"] = data["version_of"]
data["type"] = "version"
# Remove old field
del data["version_of"]
else:
# None of the old fields are set, or they are set to null/empty
data["parent"] = None
data["type"] = "root"
# Clean up any remaining old fields that might be null/empty
for old_field in ["commentary_of", "version_of", "translation_of"]:
if old_field in data:
del data[old_field]
print(f"Transformed metadata document {doc.id}: parent={data.get('parent')}, type={data.get('type')}")
# Write to dev database
dev_db.collection("metadata").document(doc.id).set(data)
print(f"Copied metadata document {doc.id}")
def copy_firestore_data():
# Target the metadata collection directly
metadata_collection = prod_db.collection("metadata")
for doc in metadata_collection.stream():
data = doc.to_dict()
# Transform the old schema fields to new schema
if "commentary_of" in data and data["commentary_of"]:
data["parent"] = data["commentary_of"]
data["type"] = "commentary"
# Remove old field
del data["commentary_of"]
elif "translation_of" in data and data["translation_of"]:
data["parent"] = data["translation_of"]
data["type"] = "translation"
# Remove old field
del data["translation_of"]
elif "version_of" in data and data["version_of"]:
data["parent"] = data["version_of"]
data["type"] = "version"
# Remove old field
del data["version_of"]
else:
# None of the old fields are set, or they are set to null/empty
data["parent"] = None
data["type"] = "root"
# Clean up any remaining old fields that might be null/empty
for old_field in ["commentary_of", "version_of", "translation_of"]:
if old_field in data:
del data[old_field]
print(f"Transformed metadata document {doc.id}: parent={data.get('parent')}, type={data.get('type')}")
# Write to dev database
dev_db.collection("metadata").document(doc.id).set(data)
print(f"Copied metadata document {doc.id}")
# Copy other collections without transformation
collections = prod_db.collections()
for coll in collections:
if coll.id == "metadata":
continue # Skip metadata - already processed above
for doc in coll.stream():
data = doc.to_dict()
dev_db.collection(coll.id).document(doc.id).set(data)
print(f"Copied document {doc.id} from {coll.id}")
def copy_storage_data():
try:
prod_bucket = prod_storage.bucket("pecha-backend.firebasestorage.app")
dev_bucket = dev_storage.bucket("pecha-backend-dev.firebasestorage.app")
blobs = list(prod_bucket.list_blobs())
for blob in blobs:
dest_blob = dev_bucket.blob(blob.name)
dest_blob.rewrite(blob)
print(f"Copied file: {blob.name}")
except NotFound as e:
print(f"Bucket not found: {e}")
if __name__ == "__main__":
migrate_metadata()
# copy_firestore_data()
# copy_storage_data()