wip: upgrade dependencies
This commit is contained in:
+1
-1
@@ -91,7 +91,7 @@ server_log.txt
|
||||
|
||||
.metals/
|
||||
|
||||
/config/production.yaml.bak
|
||||
/config/production.yaml
|
||||
/config/development.yaml
|
||||
|
||||
*.g.dart
|
||||
|
||||
+15
-12
@@ -1,14 +1,17 @@
|
||||
FROM google/dart:latest
|
||||
|
||||
COPY ./ ./
|
||||
|
||||
# Install dependencies, pre-build
|
||||
RUN pub get
|
||||
|
||||
# Optionally build generaed sources.
|
||||
# RUN pub run build_runner build
|
||||
|
||||
# Set environment, start server
|
||||
FROM dart:stable AS build-env
|
||||
LABEL stage=dart_builder
|
||||
ENV PUB_HOSTED_URL="https://pub.flutter-io.cn"
|
||||
ENV ANGEL_ENV=production
|
||||
COPY ./ ./
|
||||
RUN pub get
|
||||
RUN dart compile exe bin/prod.dart -o /server
|
||||
|
||||
FROM scratch
|
||||
WORKDIR /app
|
||||
ENV ANGEL_ENV=production
|
||||
ADD ./views ./views
|
||||
ADD ./config ./config
|
||||
COPY --from=build-env /runtime/ /
|
||||
COPY --from=build-env /server /app
|
||||
EXPOSE 3000
|
||||
CMD dart bin/prod.dart
|
||||
ENTRYPOINT ["./server", "-a", "0.0.0.0", "--port", "3000"]
|
||||
@@ -0,0 +1,34 @@
|
||||
version: "2.1"
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: postgres:latest
|
||||
restart: always
|
||||
container_name: dgm_postgres
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: Dx@8917312
|
||||
MYSQL_DATABASE: piwigo
|
||||
MYSQL_USER: debuggerx
|
||||
MYSQL_PASSWORD: dx8917312
|
||||
volumes:
|
||||
- /mnt/hd500/db:/var/lib/mysql
|
||||
ports:
|
||||
- "5432:5432"
|
||||
networks:
|
||||
- mynet
|
||||
|
||||
api:
|
||||
build: .
|
||||
container_name: dgm_api
|
||||
links:
|
||||
- dgm_postgres
|
||||
ports:
|
||||
- 8888:8888
|
||||
networks:
|
||||
- mynet
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
mynet:
|
||||
driver: bridge
|
||||
@@ -35,9 +35,13 @@ class SchemeApis {
|
||||
|
||||
String user({required StringParam type}) => [path, 'user', type].joinPath();
|
||||
|
||||
String market({required StringParam type, required IntParam page, required IntParam pageSize}) => [path, 'market', type, page, pageSize].joinPath();
|
||||
|
||||
String download({required StringParam schemeId}) => [path, 'download', schemeId].joinPath();
|
||||
|
||||
String like({required StringParam schemeId, required StringParam isLike}) => [path, 'like', schemeId, isLike].joinPath();
|
||||
|
||||
String get userLikes => [path, 'user-likes'].joinPath();
|
||||
}
|
||||
|
||||
final _paramsMap = {
|
||||
|
||||
@@ -20,4 +20,21 @@ abstract class _LikeRecord extends BaseModel {
|
||||
@Column(isNullable: false, indexType: IndexType.standardIndex)
|
||||
@SerializableField(isNullable: false)
|
||||
bool? get liked;
|
||||
}
|
||||
|
||||
|
||||
@serializable
|
||||
@Orm(tableName: 'like_records', generateMigrations: false)
|
||||
abstract class _UserLikes {
|
||||
@Column(isNullable: false)
|
||||
@SerializableField(isNullable: false)
|
||||
int? id;
|
||||
|
||||
@Column(isNullable: false)
|
||||
@SerializableField(exclude: true)
|
||||
int? get uid;
|
||||
|
||||
@Column(isNullable: false)
|
||||
@SerializableField(exclude: true)
|
||||
bool? get liked;
|
||||
}
|
||||
@@ -70,6 +70,9 @@ abstract class _SimpleScheme {
|
||||
|
||||
@serializable
|
||||
abstract class _SimpleSchemeTransMetaData {
|
||||
@SerializableField(isNullable: false)
|
||||
int? id;
|
||||
|
||||
@SerializableField(isNullable: false)
|
||||
String? get uuid;
|
||||
|
||||
@@ -90,6 +93,7 @@ abstract class _SimpleSchemeTransMetaData {
|
||||
}
|
||||
|
||||
SimpleSchemeTransMetaData transSimpleSchemeMetaData(SimpleScheme scheme) => SimpleSchemeTransMetaData(
|
||||
id: scheme.id,
|
||||
description: scheme.description,
|
||||
uuid: scheme.uuid,
|
||||
name: scheme.name,
|
||||
@@ -121,3 +125,57 @@ SchemeForDownload transSchemeForDownload(Scheme scheme) => SchemeForDownload(
|
||||
description: scheme.description,
|
||||
gestures: scheme.gestures,
|
||||
);
|
||||
|
||||
@serializable
|
||||
@Orm(tableName: 'schemes', generateMigrations: false)
|
||||
abstract class _MarketScheme {
|
||||
@Column()
|
||||
int? id;
|
||||
|
||||
@Column(isNullable: false, indexType: IndexType.unique)
|
||||
@SerializableField(isNullable: false)
|
||||
String? get uuid;
|
||||
|
||||
@Column(isNullable: false)
|
||||
@SerializableField(isNullable: false)
|
||||
String? get name;
|
||||
|
||||
@Column(type: ColumnType.text)
|
||||
String? description;
|
||||
|
||||
@Column(isNullable: false)
|
||||
@SerializableField(exclude: true)
|
||||
bool? get shared;
|
||||
|
||||
@SerializableField(isNullable: true)
|
||||
@Column(type: ColumnType.json)
|
||||
Map<String, dynamic>? get metadata;
|
||||
}
|
||||
|
||||
@serializable
|
||||
abstract class _MarketSchemeTransMetaData {
|
||||
@SerializableField(isNullable: false)
|
||||
int? id;
|
||||
|
||||
@SerializableField(isNullable: false)
|
||||
String? get uuid;
|
||||
|
||||
@SerializableField(isNullable: false)
|
||||
String? get name;
|
||||
|
||||
@SerializableField(isNullable: false)
|
||||
String? description;
|
||||
|
||||
int? get downloads;
|
||||
|
||||
int? get likes;
|
||||
}
|
||||
|
||||
MarketSchemeTransMetaData transMarketSchemeMetaData(MarketScheme scheme) => MarketSchemeTransMetaData(
|
||||
id: scheme.id,
|
||||
description: scheme.description,
|
||||
uuid: scheme.uuid,
|
||||
name: scheme.name,
|
||||
likes: scheme.metadata?['likes'] ?? 0,
|
||||
downloads: scheme.metadata?['downloads'] ?? 0,
|
||||
);
|
||||
@@ -61,41 +61,6 @@ Future configureServer(Angel app) async {
|
||||
),
|
||||
);
|
||||
|
||||
app.get(
|
||||
Apis.scheme.user.route,
|
||||
chain(
|
||||
[
|
||||
jwtMiddleware(),
|
||||
(req, res) async {
|
||||
var schemeQuery = SimpleSchemeQuery();
|
||||
var type = req.params['type'];
|
||||
var likeRecordTableName = LikeRecordQuery().tableName;
|
||||
schemeQuery.leftJoin(likeRecordTableName, SchemeFields.id, LikeRecordFields.schemeId, alias: 'lr');
|
||||
|
||||
switch (type) {
|
||||
case 'uploaded':
|
||||
schemeQuery.where!.uid.equals(req.user!.idAsInt);
|
||||
break;
|
||||
case 'downloaded':
|
||||
var downloadHistoryTableName = DownloadHistoryQuery().tableName;
|
||||
schemeQuery.leftJoin(downloadHistoryTableName, SchemeFields.id, DownloadHistoryFields.schemeId,
|
||||
alias: 'dh');
|
||||
schemeQuery.where!.raw('dh.${DownloadHistoryFields.uid} = ${req.user!.idAsInt}');
|
||||
break;
|
||||
case 'liked':
|
||||
schemeQuery.where!.raw('lr.${LikeRecordFields.uid} = ${req.user!.idAsInt}');
|
||||
schemeQuery.where!.raw('lr.${LikeRecordFields.liked} = true');
|
||||
break;
|
||||
default:
|
||||
return res.unProcessableEntity();
|
||||
}
|
||||
schemeQuery.orderBy('${schemeQuery.tableName}.${SchemeFields.updatedAt}', descending: true);
|
||||
return schemeQuery.get(req.queryExecutor).then((value) => value.map(transSimpleSchemeMetaData).toList());
|
||||
},
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
app.get(
|
||||
Apis.scheme.download.route,
|
||||
chain(
|
||||
@@ -185,4 +150,100 @@ Future configureServer(Angel app) async {
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
app.get(
|
||||
Apis.scheme.user.route,
|
||||
chain(
|
||||
[
|
||||
jwtMiddleware(),
|
||||
(req, res) async {
|
||||
var schemeQuery = SimpleSchemeQuery();
|
||||
var type = req.params['type'];
|
||||
var likeRecordTableName = LikeRecordQuery().tableName;
|
||||
schemeQuery.leftJoin(likeRecordTableName, SchemeFields.id, LikeRecordFields.schemeId, alias: 'lr');
|
||||
|
||||
switch (type) {
|
||||
case 'uploaded':
|
||||
schemeQuery.where!.uid.equals(req.user!.idAsInt);
|
||||
break;
|
||||
case 'downloaded':
|
||||
var downloadHistoryTableName = DownloadHistoryQuery().tableName;
|
||||
schemeQuery.leftJoin(downloadHistoryTableName, SchemeFields.id, DownloadHistoryFields.schemeId,
|
||||
alias: 'dh');
|
||||
schemeQuery.where!.raw('dh.${DownloadHistoryFields.uid} = ${req.user!.idAsInt}');
|
||||
break;
|
||||
case 'liked':
|
||||
schemeQuery.where!.raw('lr.${LikeRecordFields.uid} = ${req.user!.idAsInt}');
|
||||
schemeQuery.where!.raw('lr.${LikeRecordFields.liked} = true');
|
||||
break;
|
||||
default:
|
||||
return res.unProcessableEntity();
|
||||
}
|
||||
schemeQuery.orderBy('${schemeQuery.tableName}.${SchemeFields.updatedAt}', descending: true);
|
||||
return schemeQuery.get(req.queryExecutor).then((value) => value.map(transSimpleSchemeMetaData).toList());
|
||||
},
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
const recommend = "(metadata->'recommends') is null ,(metadata->'recommends')::int";
|
||||
const updated = "updated_at";
|
||||
const likes = "(metadata->'likes') is null ,(metadata->'likes')::int";
|
||||
const downloads = "(metadata->'downloads') is null ,(metadata->'downloads')::int";
|
||||
|
||||
app.get(Apis.scheme.market.route, (req, res) async {
|
||||
var schemeQuery = MarketSchemeQuery();
|
||||
var type = req.params['type'];
|
||||
var page = req.params['page'] as int;
|
||||
var pageSize = req.params['pageSize'] as int;
|
||||
schemeQuery.where?.shared.equals(true);
|
||||
late List<String> orders;
|
||||
|
||||
switch (type) {
|
||||
case 'recommend':
|
||||
// orders = [recommend, likes, downloads, SchemeFields.id];
|
||||
orders = [recommend];
|
||||
break;
|
||||
case 'updated':
|
||||
orders = [updated];
|
||||
break;
|
||||
case 'likes':
|
||||
// orders = [likes, recommend, downloads, SchemeFields.id];
|
||||
orders = [likes];
|
||||
break;
|
||||
case 'downloads':
|
||||
// orders = [downloads, recommend, likes, SchemeFields.id];
|
||||
orders = [downloads];
|
||||
break;
|
||||
default:
|
||||
return res.unProcessableEntity();
|
||||
}
|
||||
for (var order in orders) {
|
||||
schemeQuery.orderBy(order, descending: true);
|
||||
}
|
||||
schemeQuery.offset(page * pageSize);
|
||||
schemeQuery.limit(pageSize + 1);
|
||||
return schemeQuery.get(req.queryExecutor).then((value) {
|
||||
var hasMore = value.length > pageSize;
|
||||
if (hasMore) value.removeLast();
|
||||
return {
|
||||
'hasMore': hasMore,
|
||||
'items': value.map(transMarketSchemeMetaData).toList(),
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
app.get(
|
||||
Apis.scheme.userLikes,
|
||||
chain(
|
||||
[
|
||||
jwtMiddleware(),
|
||||
(req, res) async => (UserLikesQuery()
|
||||
..where?.uid.equals(req.user!.idAsInt)
|
||||
..where?.liked.equals(true))
|
||||
.get(req.queryExecutor)
|
||||
.then((value) => value.map((e) => e.id).toList()),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ dependencies:
|
||||
angel3_orm_postgres: ^3.3.0
|
||||
angel3_serialize: ^4.1.0
|
||||
angel3_production: ^3.1.2
|
||||
angel3_static: ^4.1.0
|
||||
belatuk_pretty_logging: ^4.0.0
|
||||
optional: ^6.0.0
|
||||
logging: ^1.0.0
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
docker build -t dgm_api_image .
|
||||
docker image prune -f --filter label=stage=dart_builder
|
||||
docker rm -f dgm_api
|
||||
docker run -d --restart=always --name dgm_api -p 3000:3000 dgm_api_image
|
||||
docker image prune -f
|
||||
Reference in New Issue
Block a user