5
5
use Illuminate \Database \Eloquent \Model ;
6
6
use Illuminate \Support \Facades \Cache ;
7
7
use Statamic \Assets \Asset as FileAsset ;
8
- use Statamic \Assets \AssetUploader as Uploader ;
9
8
use Statamic \Contracts \Assets \Asset as AssetContract ;
10
9
use Statamic \Data \HasDirtyState ;
11
- use Statamic \Facades \Blink ;
12
- use Statamic \Facades \Path ;
13
10
use Statamic \Support \Arr ;
14
11
use Statamic \Support \Str ;
15
12
16
13
class Asset extends FileAsset
17
14
{
15
+ protected $ model ;
16
+
18
17
use HasDirtyState {
19
18
syncOriginal as traitSyncOriginal;
20
19
}
@@ -36,10 +35,8 @@ public static function fromModel(Model $model)
36
35
->container ($ model ->container )
37
36
->path (Str::replace ('// ' , '/ ' , $ model ->folder .'/ ' .$ model ->basename ))
38
37
->hydrateMeta ($ model ->meta )
39
- ->syncOriginal ();
40
-
41
- Blink::put ('eloquent-asset- ' .$ asset ->id (), $ asset );
42
- Blink::put ($ asset ->metaCacheKey (), $ model ->meta );
38
+ ->syncOriginal ()
39
+ ->model ($ model );
43
40
44
41
return $ asset ;
45
42
}
@@ -65,29 +62,17 @@ public function meta($key = null)
65
62
return $ meta ;
66
63
}
67
64
68
- // this handles asset::make() without save()
69
- // e.g. when checking a file exists already when uploading
70
- if (! $ this ->disk ()->exists ($ this ->path ())) {
71
- return ['data ' => []];
65
+ if ($ meta = $ this ->model ()?->meta) {
66
+ return $ meta ;
72
67
}
73
68
74
- return Blink::once ($ this ->metaCacheKey (), function () {
75
- if ($ model = app ('statamic.eloquent.assets.model ' )::where ([
76
- 'container ' => $ this ->containerHandle (),
77
- 'folder ' => $ this ->folder (),
78
- 'basename ' => $ this ->basename (),
79
- ])->first ()) {
80
- return $ model ->meta ;
81
- }
69
+ $ meta = $ this ->generateMeta ();
82
70
83
- $ meta = $ this ->generateMeta ();
84
-
85
- if (! $ meta ['data ' ]) {
86
- $ meta ['data ' ] = [];
87
- }
71
+ if (! $ meta ['data ' ]) {
72
+ $ meta ['data ' ] = [];
73
+ }
88
74
89
- return $ meta ;
90
- });
75
+ return $ meta ;
91
76
}
92
77
93
78
public function exists ()
@@ -97,18 +82,7 @@ public function exists()
97
82
98
83
public function metaExists ()
99
84
{
100
- if (Blink::has ($ this ->metaCacheKey ())) {
101
- return true ;
102
- }
103
-
104
- return Blink::once ('eloquent-asset-meta-exists- ' .$ this ->id (), function () {
105
- return app ('statamic.eloquent.assets.model ' )::query ()
106
- ->where ([
107
- 'container ' => $ this ->containerHandle (),
108
- 'folder ' => $ this ->folder (),
109
- 'basename ' => $ this ->basename (),
110
- ])->exists ();
111
- });
85
+ return $ this ->model () ? true : false ;
112
86
}
113
87
114
88
private function metaValue ($ key )
@@ -142,12 +116,15 @@ public function hydrateMeta($meta)
142
116
143
117
public function writeMeta ($ meta )
144
118
{
145
- $ meta ['data ' ] = Arr::removeNullValues ($ meta ['data ' ]);
119
+ $ meta ['data ' ] = Arr::removeNullValues ($ meta ['data ' ] ?? []);
120
+
121
+ if (! $ model = self ::makeModelFromContract ($ this , $ meta )) {
122
+ return ;
123
+ }
146
124
147
- self :: makeModelFromContract ( $ this , $ meta )? ->save();
125
+ $ model ->save ();
148
126
149
- Blink::put ($ this ->metaCacheKey (), $ meta );
150
- Blink::put ('eloquent-asset-meta-exists- ' .$ this ->id (), true );
127
+ $ this ->model ($ model );
151
128
}
152
129
153
130
public static function makeModelFromContract (AssetContract $ source , $ meta = [])
@@ -156,18 +133,26 @@ public static function makeModelFromContract(AssetContract $source, $meta = [])
156
133
$ meta = $ source ->meta ();
157
134
}
158
135
159
- // Make shure that a extension could be found, as the extension field is required.
136
+ // Make sure that a extension could be found, as the extension field is required.
160
137
if (! $ extension = $ source ->extension ()) {
161
138
return null ;
162
139
}
163
140
164
- $ original = $ source ->getOriginal ();
141
+ $ model = false ;
142
+
143
+ if (method_exists ($ source , 'model ' )) {
144
+ $ model = $ source ->model ();
145
+ }
146
+
147
+ if (! $ model ) {
148
+ $ model = app ('statamic.eloquent.assets.model ' )::make ([
149
+ 'container ' => $ source ->containerHandle (),
150
+ 'folder ' => $ source ->folder (),
151
+ 'basename ' => $ source ->basename (),
152
+ ]);
153
+ }
165
154
166
- $ model = app ('statamic.eloquent.assets.model ' )::firstOrNew ([
167
- 'container ' => $ source ->containerHandle (),
168
- 'folder ' => Arr::get ($ original , 'folder ' , $ source ->folder ()),
169
- 'basename ' => Arr::get ($ original , 'basename ' , $ source ->basename ()),
170
- ])->fill ([
155
+ $ model ->fill ([
171
156
'meta ' => $ meta ,
172
157
'filename ' => $ source ->filename (),
173
158
'extension ' => $ extension ,
@@ -185,50 +170,22 @@ public static function makeModelFromContract(AssetContract $source, $meta = [])
185
170
return $ model ;
186
171
}
187
172
188
- public function metaPath ()
189
- {
190
- return $ this ->path ();
191
- }
192
-
193
- /**
194
- * Move the asset to a different location.
195
- *
196
- * @param string $folder The folder relative to the container.
197
- * @param string|null $filename The new filename, if renaming.
198
- * @return $this
199
- */
200
- public function move ($ folder , $ filename = null )
173
+ public function model ($ model = null )
201
174
{
202
- $ filename = Uploader::getSafeFilename ($ filename ?: $ this ->filename ());
203
- $ oldPath = $ this ->path ();
204
- $ oldMetaPath = $ this ->metaPath ();
205
- $ oldFolder = $ this ->folder ();
206
- $ oldBasename = $ this ->basename ();
207
- $ newPath = Str::removeLeft (Path::tidy ($ folder .'/ ' .$ filename .'. ' .pathinfo ($ oldPath , PATHINFO_EXTENSION )), '/ ' );
208
-
209
- $ this ->hydrate ();
210
- $ this ->disk ()->rename ($ oldPath , $ newPath );
211
- $ this ->path ($ newPath );
212
- $ this ->save ();
213
-
214
- if ($ oldMetaPath != $ this ->metaPath ()) {
215
- $ oldMetaModel = app ('statamic.eloquent.assets.model ' )::where ([
216
- 'container ' => $ this ->containerHandle (),
217
- 'folder ' => $ oldFolder ,
218
- 'basename ' => $ oldBasename ,
219
- ])->first ();
220
-
221
- if ($ oldMetaModel ) {
222
- $ meta = $ oldMetaModel ->meta ;
223
- $ oldMetaModel ->delete ();
224
-
225
- $ this ->writeMeta ($ meta );
226
- }
175
+ if (func_num_args () === 0 ) {
176
+ return $ this ->model ;
227
177
}
228
178
179
+ $ this ->model = $ model ;
180
+
229
181
return $ this ;
230
182
}
231
183
184
+ public function metaPath ()
185
+ {
186
+ return $ this ->path ();
187
+ }
188
+
232
189
public function getCurrentDirtyStateAttributes (): array
233
190
{
234
191
return array_merge ([
@@ -243,8 +200,6 @@ protected function clearCaches()
243
200
{
244
201
$ this ->meta = null ;
245
202
246
- Blink::forget ("eloquent-asset- {$ this ->id ()}" );
247
- Blink::forget ($ this ->metaCacheKey ());
248
203
Cache::forget ($ this ->metaCacheKey ());
249
204
}
250
205
}
0 commit comments