diff --git a/doc/index.html b/doc/index.html
index 1d54944..74be57a 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -3234,6 +3234,14 @@
Project
AvatarUrl of the Project |
+
+ | slug |
+ string |
+ |
+ Slug is an immutable identifier of the project.
+Guaranteed to be unique within a tenant. |
+
+
diff --git a/go/fits/api/v1/project.pb.go b/go/fits/api/v1/project.pb.go
index cf9d970..52b83a0 100644
--- a/go/fits/api/v1/project.pb.go
+++ b/go/fits/api/v1/project.pb.go
@@ -10,7 +10,6 @@ import (
_ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- _ "google.golang.org/protobuf/types/known/timestamppb"
reflect "reflect"
sync "sync"
unsafe "unsafe"
@@ -38,7 +37,10 @@ type Project struct {
// Tenant this project belongs to
Tenant string `protobuf:"bytes,5,opt,name=tenant,proto3" json:"tenant,omitempty"`
// AvatarUrl of the Project
- AvatarUrl *string `protobuf:"bytes,6,opt,name=avatar_url,json=avatarUrl,proto3,oneof" json:"avatar_url,omitempty"`
+ AvatarUrl *string `protobuf:"bytes,6,opt,name=avatar_url,json=avatarUrl,proto3,oneof" json:"avatar_url,omitempty"`
+ // Slug is an immutable identifier of the project.
+ // Guaranteed to be unique within a tenant.
+ Slug string `protobuf:"bytes,7,opt,name=slug,proto3" json:"slug,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -115,6 +117,13 @@ func (x *Project) GetAvatarUrl() string {
return ""
}
+func (x *Project) GetSlug() string {
+ if x != nil {
+ return x.Slug
+ }
+ return ""
+}
+
// ProjectServiceListRequest is the request payload to list all projects
type ProjectServiceListRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -688,7 +697,7 @@ var File_fits_api_v1_project_proto protoreflect.FileDescriptor
const file_fits_api_v1_project_proto_rawDesc = "" +
"\n" +
- "\x19fits/api/v1/project.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xdf\x01\n" +
+ "\x19fits/api/v1/project.proto\x12\vfits.api.v1\x1a\x1bbuf/validate/validate.proto\x1a\x18fits/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xf3\x01\n" +
"\aProject\x12\x12\n" +
"\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n" +
"\x04meta\x18\x02 \x01(\v2\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n" +
@@ -696,7 +705,8 @@ const file_fits_api_v1_project_proto_rawDesc = "" +
"\vdescription\x18\x04 \x01(\tB\v\xbaH\br\x06ȳ\xae\xb1\x02\x01R\vdescription\x12\x16\n" +
"\x06tenant\x18\x05 \x01(\tR\x06tenant\x12\"\n" +
"\n" +
- "avatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01B\r\n" +
+ "avatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12\x12\n" +
+ "\x04slug\x18\a \x01(\tR\x04slugB\r\n" +
"\v_avatar_url\"\xd8\x01\n" +
"\x19ProjectServiceListRequest\x12\x13\n" +
"\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n" +
diff --git a/js/fits/api/v1/project_pb.d.ts b/js/fits/api/v1/project_pb.d.ts
index 1ea9eb6..f0cb9ea 100644
--- a/js/fits/api/v1/project_pb.d.ts
+++ b/js/fits/api/v1/project_pb.d.ts
@@ -48,6 +48,13 @@ export type Project = Message<"fits.api.v1.Project"> & {
* @generated from field: optional string avatar_url = 6;
*/
avatarUrl?: string | undefined;
+ /**
+ * Slug is an immutable identifier of the project.
+ * Guaranteed to be unique within a tenant.
+ *
+ * @generated from field: string slug = 7;
+ */
+ slug: string;
};
/**
* Describes the message fits.api.v1.Project.
diff --git a/js/fits/api/v1/project_pb.js b/js/fits/api/v1/project_pb.js
index d24ede8..f530b23 100644
--- a/js/fits/api/v1/project_pb.js
+++ b/js/fits/api/v1/project_pb.js
@@ -5,11 +5,10 @@ import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2
import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
/**
* Describes the file fits/api/v1/project.proto.
*/
-export const file_fits_api_v1_project = /*@__PURE__*/ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+export const file_fits_api_v1_project = /*@__PURE__*/ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSK7AQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBEgwKBHNsdWcYByABKAlCDQoLX2F2YXRhcl91cmwivgEKGVByb2plY3RTZXJ2aWNlTGlzdFJlcXVlc3QSDwoCaWQYASABKAlIAIgBARIeCgRuYW1lGAIgASgJQgu6SAhyBsCzrrECAUgBiAEBEiAKBnRlbmFudBgDIAEoCUILukgIcgbAs66xAgFIAogBARIoCgZsYWJlbHMYBCABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIA4gBAUIFCgNfaWRCBwoFX25hbWVCCQoHX3RlbmFudEIJCgdfbGFiZWxzIkQKGlByb2plY3RTZXJ2aWNlTGlzdFJlc3BvbnNlEiYKCHByb2plY3RzGAEgAygLMhQuZml0cy5hcGkudjEuUHJvamVjdCI1ChhQcm9qZWN0U2VydmljZUdldFJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiQgoZUHJvamVjdFNlcnZpY2VHZXRSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCLDAQobUHJvamVjdFNlcnZpY2VDcmVhdGVSZXF1ZXN0EhoKBWxvZ2luGAEgASgJQgu6SAhyBsCzrrECARIZCgRuYW1lGAIgASgJQgu6SAhyBsCzrrECARIgCgtkZXNjcmlwdGlvbhgDIAEoCUILukgIcgbIs66xAgESFwoKYXZhdGFyX3VybBgEIAEoCUgAiAEBEiMKBmxhYmVscxgFIAEoCzITLmZpdHMuYXBpLnYxLkxhYmVsc0INCgtfYXZhdGFyX3VybCJFChxQcm9qZWN0U2VydmljZUNyZWF0ZVJlc3BvbnNlEiUKB3Byb2plY3QYASABKAsyFC5maXRzLmFwaS52MS5Qcm9qZWN0IjgKG1Byb2plY3RTZXJ2aWNlRGVsZXRlUmVxdWVzdBIZCgdwcm9qZWN0GAEgASgJQgi6SAVyA7ABASJFChxQcm9qZWN0U2VydmljZURlbGV0ZVJlc3BvbnNlEiUKB3Byb2plY3QYASABKAsyFC5maXRzLmFwaS52MS5Qcm9qZWN0IrECChtQcm9qZWN0U2VydmljZVVwZGF0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQESNAoLdXBkYXRlX21ldGEYAiABKAsyFy5maXRzLmFwaS52MS5VcGRhdGVNZXRhQga6SAPIAQESHgoEbmFtZRgDIAEoCUILukgIcgbAs66xAgFIAIgBARIlCgtkZXNjcmlwdGlvbhgEIAEoCUILukgIcgbIs66xAgFIAYgBARIXCgphdmF0YXJfdXJsGAUgASgJSAKIAQESLgoGbGFiZWxzGAYgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSAOIAQFCBwoFX25hbWVCDgoMX2Rlc2NyaXB0aW9uQg0KC19hdmF0YXJfdXJsQgkKB19sYWJlbHMiRQocUHJvamVjdFNlcnZpY2VVcGRhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdDKWBAoOUHJvamVjdFNlcnZpY2USYQoETGlzdBImLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlTGlzdFJlcXVlc3QaJy5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYQoDR2V0EiUuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0GiYuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VHZXRSZXNwb25zZSILyvMYAwECA+DzGAISaQoGQ3JlYXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VDcmVhdGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJoCgZEZWxldGUSKC5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QaKS5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZURlbGV0ZVJlc3BvbnNlIgnK8xgBAeDzGAESaQoGVXBkYXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKyvMYAgEC4PMYAUKYAQoPY29tLmZpdHMuYXBpLnYxQgxQcm9qZWN0UHJvdG9QAVopZ2l0aHViLmNvbS9maS10cy9hcGkvZ28vZml0cy9hcGkvdjE7YXBpdjGiAgNGQViqAgtGaXRzLkFwaS5WMcoCC0ZpdHNcQXBpXFYx4gIXRml0c1xBcGlcVjFcR1BCTWV0YWRhdGHqAg1GaXRzOjpBcGk6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Describes the message fits.api.v1.Project.
* Use `create(ProjectSchema)` to create a new message.
diff --git a/js/fits/api/v1/project_pb.ts b/js/fits/api/v1/project_pb.ts
index 9af8676..df4f575 100644
--- a/js/fits/api/v1/project_pb.ts
+++ b/js/fits/api/v1/project_pb.ts
@@ -8,14 +8,13 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import type { Labels, Meta, UpdateLabels, UpdateMeta } from "./common_pb";
import { file_fits_api_v1_common } from "./common_pb";
import { file_fits_api_v1_predefined_rules } from "./predefined_rules_pb";
-import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file fits/api/v1/project.proto.
*/
export const file_fits_api_v1_project: GenFile = /*@__PURE__*/
- fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSKtAQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBQg0KC19hdmF0YXJfdXJsIr4BChlQcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0Eg8KAmlkGAEgASgJSACIAQESHgoEbmFtZRgCIAEoCUILukgIcgbAs66xAgFIAYgBARIgCgZ0ZW5hbnQYAyABKAlCC7pICHIGwLOusQIBSAKIAQESKAoGbGFiZWxzGAQgASgLMhMuZml0cy5hcGkudjEuTGFiZWxzSAOIAQFCBQoDX2lkQgcKBV9uYW1lQgkKB190ZW5hbnRCCQoHX2xhYmVscyJEChpQcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZRImCghwcm9qZWN0cxgBIAMoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiNQoYUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBIkIKGVByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QiwwEKG1Byb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBIaCgVsb2dpbhgBIAEoCUILukgIcgbAs66xAgESGQoEbmFtZRgCIAEoCUILukgIcgbAs66xAgESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEhcKCmF2YXRhcl91cmwYBCABKAlIAIgBARIjCgZsYWJlbHMYBSABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNCDQoLX2F2YXRhcl91cmwiRQocUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCI4ChtQcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiRQocUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCKxAgobUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0EhkKB3Byb2plY3QYASABKAlCCLpIBXIDsAEBEjQKC3VwZGF0ZV9tZXRhGAIgASgLMhcuZml0cy5hcGkudjEuVXBkYXRlTWV0YUIGukgDyAEBEh4KBG5hbWUYAyABKAlCC7pICHIGwLOusQIBSACIAQESJQoLZGVzY3JpcHRpb24YBCABKAlCC7pICHIGyLOusQIBSAGIAQESFwoKYXZhdGFyX3VybBgFIAEoCUgCiAEBEi4KBmxhYmVscxgGIAEoCzIZLmZpdHMuYXBpLnYxLlVwZGF0ZUxhYmVsc0gDiAEBQgcKBV9uYW1lQg4KDF9kZXNjcmlwdGlvbkINCgtfYXZhdGFyX3VybEIJCgdfbGFiZWxzIkUKHFByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2USJQoHcHJvamVjdBgBIAEoCzIULmZpdHMuYXBpLnYxLlByb2plY3QylgQKDlByb2plY3RTZXJ2aWNlEmEKBExpc3QSJi5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXF1ZXN0GicuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgCEmEKA0dldBIlLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVxdWVzdBomLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlR2V0UmVzcG9uc2UiC8rzGAMBAgPg8xgCEmkKBkNyZWF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCsLzGAIBAuDzGAESaAoGRGVsZXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VEZWxldGVSZXNwb25zZSIJyvMYAQHg8xgBEmkKBlVwZGF0ZRIoLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVxdWVzdBopLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlVXBkYXRlUmVzcG9uc2UiCsrzGAIBAuDzGAFCmAEKD2NvbS5maXRzLmFwaS52MUIMUHJvamVjdFByb3RvUAFaKWdpdGh1Yi5jb20vZmktdHMvYXBpL2dvL2ZpdHMvYXBpL3YxO2FwaXYxogIDRkFYqgILRml0cy5BcGkuVjHKAgtGaXRzXEFwaVxWMeICF0ZpdHNcQXBpXFYxXEdQQk1ldGFkYXRh6gINRml0czo6QXBpOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules, file_google_protobuf_timestamp]);
+ fileDesc("ChlmaXRzL2FwaS92MS9wcm9qZWN0LnByb3RvEgtmaXRzLmFwaS52MSK7AQoHUHJvamVjdBIMCgR1dWlkGAEgASgJEh8KBG1ldGEYAiABKAsyES5maXRzLmFwaS52MS5NZXRhEhkKBG5hbWUYAyABKAlCC7pICHIGwLOusQIBEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARIOCgZ0ZW5hbnQYBSABKAkSFwoKYXZhdGFyX3VybBgGIAEoCUgAiAEBEgwKBHNsdWcYByABKAlCDQoLX2F2YXRhcl91cmwivgEKGVByb2plY3RTZXJ2aWNlTGlzdFJlcXVlc3QSDwoCaWQYASABKAlIAIgBARIeCgRuYW1lGAIgASgJQgu6SAhyBsCzrrECAUgBiAEBEiAKBnRlbmFudBgDIAEoCUILukgIcgbAs66xAgFIAogBARIoCgZsYWJlbHMYBCABKAsyEy5maXRzLmFwaS52MS5MYWJlbHNIA4gBAUIFCgNfaWRCBwoFX25hbWVCCQoHX3RlbmFudEIJCgdfbGFiZWxzIkQKGlByb2plY3RTZXJ2aWNlTGlzdFJlc3BvbnNlEiYKCHByb2plY3RzGAEgAygLMhQuZml0cy5hcGkudjEuUHJvamVjdCI1ChhQcm9qZWN0U2VydmljZUdldFJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQEiQgoZUHJvamVjdFNlcnZpY2VHZXRSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdCLDAQobUHJvamVjdFNlcnZpY2VDcmVhdGVSZXF1ZXN0EhoKBWxvZ2luGAEgASgJQgu6SAhyBsCzrrECARIZCgRuYW1lGAIgASgJQgu6SAhyBsCzrrECARIgCgtkZXNjcmlwdGlvbhgDIAEoCUILukgIcgbIs66xAgESFwoKYXZhdGFyX3VybBgEIAEoCUgAiAEBEiMKBmxhYmVscxgFIAEoCzITLmZpdHMuYXBpLnYxLkxhYmVsc0INCgtfYXZhdGFyX3VybCJFChxQcm9qZWN0U2VydmljZUNyZWF0ZVJlc3BvbnNlEiUKB3Byb2plY3QYASABKAsyFC5maXRzLmFwaS52MS5Qcm9qZWN0IjgKG1Byb2plY3RTZXJ2aWNlRGVsZXRlUmVxdWVzdBIZCgdwcm9qZWN0GAEgASgJQgi6SAVyA7ABASJFChxQcm9qZWN0U2VydmljZURlbGV0ZVJlc3BvbnNlEiUKB3Byb2plY3QYASABKAsyFC5maXRzLmFwaS52MS5Qcm9qZWN0IrECChtQcm9qZWN0U2VydmljZVVwZGF0ZVJlcXVlc3QSGQoHcHJvamVjdBgBIAEoCUIIukgFcgOwAQESNAoLdXBkYXRlX21ldGEYAiABKAsyFy5maXRzLmFwaS52MS5VcGRhdGVNZXRhQga6SAPIAQESHgoEbmFtZRgDIAEoCUILukgIcgbAs66xAgFIAIgBARIlCgtkZXNjcmlwdGlvbhgEIAEoCUILukgIcgbIs66xAgFIAYgBARIXCgphdmF0YXJfdXJsGAUgASgJSAKIAQESLgoGbGFiZWxzGAYgASgLMhkuZml0cy5hcGkudjEuVXBkYXRlTGFiZWxzSAOIAQFCBwoFX25hbWVCDgoMX2Rlc2NyaXB0aW9uQg0KC19hdmF0YXJfdXJsQgkKB19sYWJlbHMiRQocUHJvamVjdFNlcnZpY2VVcGRhdGVSZXNwb25zZRIlCgdwcm9qZWN0GAEgASgLMhQuZml0cy5hcGkudjEuUHJvamVjdDKWBAoOUHJvamVjdFNlcnZpY2USYQoETGlzdBImLmZpdHMuYXBpLnYxLlByb2plY3RTZXJ2aWNlTGlzdFJlcXVlc3QaJy5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZUxpc3RSZXNwb25zZSII2PMYAuDzGAISYQoDR2V0EiUuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VHZXRSZXF1ZXN0GiYuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VHZXRSZXNwb25zZSILyvMYAwECA+DzGAISaQoGQ3JlYXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VDcmVhdGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VDcmVhdGVSZXNwb25zZSIKwvMYAgEC4PMYARJoCgZEZWxldGUSKC5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZURlbGV0ZVJlcXVlc3QaKS5maXRzLmFwaS52MS5Qcm9qZWN0U2VydmljZURlbGV0ZVJlc3BvbnNlIgnK8xgBAeDzGAESaQoGVXBkYXRlEiguZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VVcGRhdGVSZXF1ZXN0GikuZml0cy5hcGkudjEuUHJvamVjdFNlcnZpY2VVcGRhdGVSZXNwb25zZSIKyvMYAgEC4PMYAUKYAQoPY29tLmZpdHMuYXBpLnYxQgxQcm9qZWN0UHJvdG9QAVopZ2l0aHViLmNvbS9maS10cy9hcGkvZ28vZml0cy9hcGkvdjE7YXBpdjGiAgNGQViqAgtGaXRzLkFwaS5WMcoCC0ZpdHNcQXBpXFYx4gIXRml0c1xBcGlcVjFcR1BCTWV0YWRhdGHqAg1GaXRzOjpBcGk6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_fits_api_v1_common, file_fits_api_v1_predefined_rules]);
/**
* Project defines a group of resources belonging to a tenant
@@ -65,6 +64,14 @@ export type Project = Message<"fits.api.v1.Project"> & {
* @generated from field: optional string avatar_url = 6;
*/
avatarUrl?: string | undefined;
+
+ /**
+ * Slug is an immutable identifier of the project.
+ * Guaranteed to be unique within a tenant.
+ *
+ * @generated from field: string slug = 7;
+ */
+ slug: string;
};
/**
diff --git a/proto/fits/api/v1/project.proto b/proto/fits/api/v1/project.proto
index a4a2871..8f610d8 100644
--- a/proto/fits/api/v1/project.proto
+++ b/proto/fits/api/v1/project.proto
@@ -5,7 +5,6 @@ package fits.api.v1;
import "buf/validate/validate.proto";
import "fits/api/v1/common.proto";
import "fits/api/v1/predefined_rules.proto";
-import "google/protobuf/timestamp.proto";
// ProjectService provides project management operations.
service ProjectService {
@@ -55,6 +54,9 @@ message Project {
string tenant = 5;
// AvatarUrl of the Project
optional string avatar_url = 6;
+ // Slug is an immutable identifier of the project.
+ // Guaranteed to be unique within a tenant.
+ string slug = 7;
}
// ProjectServiceListRequest is the request payload to list all projects
diff --git a/python/fits/api/v1/project_pb2.py b/python/fits/api/v1/project_pb2.py
index 73dad2b..ce0622d 100644
--- a/python/fits/api/v1/project_pb2.py
+++ b/python/fits/api/v1/project_pb2.py
@@ -25,10 +25,9 @@
from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2
from fits.api.v1 import common_pb2 as fits_dot_api_dot_v1_dot_common__pb2
from fits.api.v1 import predefined_rules_pb2 as fits_dot_api_dot_v1_dot_predefined__rules__pb2
-from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66its/api/v1/project.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xdf\x01\n\x07Project\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x16\n\x06tenant\x18\x05 \x01(\tR\x06tenant\x12\"\n\navatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x42\r\n\x0b_avatar_url\"\xd8\x01\n\x19ProjectServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12(\n\x06tenant\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x06tenant\x88\x01\x01\x12\x30\n\x06labels\x18\x04 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x03R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_tenantB\t\n\x07_labels\"N\n\x1aProjectServiceListResponse\x12\x30\n\x08projects\x18\x01 \x03(\x0b\x32\x14.fits.api.v1.ProjectR\x08projects\">\n\x18ProjectServiceGetRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"K\n\x19ProjectServiceGetResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xf0\x01\n\x1bProjectServiceCreateRequest\x12!\n\x05login\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05login\x12\x1f\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\"\n\navatar_url\x18\x04 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\r\n\x0b_avatar_url\"N\n\x1cProjectServiceCreateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"A\n\x1bProjectServiceDeleteRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"N\n\x1cProjectServiceDeleteResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xec\x02\n\x1bProjectServiceUpdateRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x01R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x05 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x06 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x03R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"N\n\x1cProjectServiceUpdateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project2\x96\x04\n\x0eProjectService\x12\x61\n\x04List\x12&.fits.api.v1.ProjectServiceListRequest\x1a\'.fits.api.v1.ProjectServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12\x61\n\x03Get\x12%.fits.api.v1.ProjectServiceGetRequest\x1a&.fits.api.v1.ProjectServiceGetResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x43reate\x12(.fits.api.v1.ProjectServiceCreateRequest\x1a).fits.api.v1.ProjectServiceCreateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12h\n\x06\x44\x65lete\x12(.fits.api.v1.ProjectServiceDeleteRequest\x1a).fits.api.v1.ProjectServiceDeleteResponse\"\t\xca\xf3\x18\x01\x01\xe0\xf3\x18\x01\x12i\n\x06Update\x12(.fits.api.v1.ProjectServiceUpdateRequest\x1a).fits.api.v1.ProjectServiceUpdateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x98\x01\n\x0f\x63om.fits.api.v1B\x0cProjectProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66its/api/v1/project.proto\x12\x0b\x66its.api.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x18\x66its/api/v1/common.proto\x1a\"fits/api/v1/predefined_rules.proto\"\xf3\x01\n\x07Project\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12%\n\x04meta\x18\x02 \x01(\x0b\x32\x11.fits.api.v1.MetaR\x04meta\x12\x1f\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\x16\n\x06tenant\x18\x05 \x01(\tR\x06tenant\x12\"\n\navatar_url\x18\x06 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12\x12\n\x04slug\x18\x07 \x01(\tR\x04slugB\r\n\x0b_avatar_url\"\xd8\x01\n\x19ProjectServiceListRequest\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12$\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04name\x88\x01\x01\x12(\n\x06tenant\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x06tenant\x88\x01\x01\x12\x30\n\x06labels\x18\x04 \x01(\x0b\x32\x13.fits.api.v1.LabelsH\x03R\x06labels\x88\x01\x01\x42\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_tenantB\t\n\x07_labels\"N\n\x1aProjectServiceListResponse\x12\x30\n\x08projects\x18\x01 \x03(\x0b\x32\x14.fits.api.v1.ProjectR\x08projects\">\n\x18ProjectServiceGetRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"K\n\x19ProjectServiceGetResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xf0\x01\n\x1bProjectServiceCreateRequest\x12!\n\x05login\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x05login\x12\x1f\n\x04name\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12\"\n\navatar_url\x18\x04 \x01(\tH\x00R\tavatarUrl\x88\x01\x01\x12+\n\x06labels\x18\x05 \x01(\x0b\x32\x13.fits.api.v1.LabelsR\x06labelsB\r\n\x0b_avatar_url\"N\n\x1cProjectServiceCreateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"A\n\x1bProjectServiceDeleteRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\"N\n\x1cProjectServiceDeleteResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project\"\xec\x02\n\x1bProjectServiceUpdateRequest\x12\"\n\x07project\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x07project\x12@\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x17.fits.api.v1.UpdateMetaB\x06\xbaH\x03\xc8\x01\x01R\nupdateMeta\x12$\n\x04name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04name\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x01R\x0b\x64\x65scription\x88\x01\x01\x12\"\n\navatar_url\x18\x05 \x01(\tH\x02R\tavatarUrl\x88\x01\x01\x12\x36\n\x06labels\x18\x06 \x01(\x0b\x32\x19.fits.api.v1.UpdateLabelsH\x03R\x06labels\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\r\n\x0b_avatar_urlB\t\n\x07_labels\"N\n\x1cProjectServiceUpdateResponse\x12.\n\x07project\x18\x01 \x01(\x0b\x32\x14.fits.api.v1.ProjectR\x07project2\x96\x04\n\x0eProjectService\x12\x61\n\x04List\x12&.fits.api.v1.ProjectServiceListRequest\x1a\'.fits.api.v1.ProjectServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x02\x12\x61\n\x03Get\x12%.fits.api.v1.ProjectServiceGetRequest\x1a&.fits.api.v1.ProjectServiceGetResponse\"\x0b\xca\xf3\x18\x03\x01\x02\x03\xe0\xf3\x18\x02\x12i\n\x06\x43reate\x12(.fits.api.v1.ProjectServiceCreateRequest\x1a).fits.api.v1.ProjectServiceCreateResponse\"\n\xc2\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x12h\n\x06\x44\x65lete\x12(.fits.api.v1.ProjectServiceDeleteRequest\x1a).fits.api.v1.ProjectServiceDeleteResponse\"\t\xca\xf3\x18\x01\x01\xe0\xf3\x18\x01\x12i\n\x06Update\x12(.fits.api.v1.ProjectServiceUpdateRequest\x1a).fits.api.v1.ProjectServiceUpdateResponse\"\n\xca\xf3\x18\x02\x01\x02\xe0\xf3\x18\x01\x42\x98\x01\n\x0f\x63om.fits.api.v1B\x0cProjectProtoP\x01Z)github.com/fi-ts/api/go/fits/api/v1;apiv1\xa2\x02\x03\x46\x41X\xaa\x02\x0b\x46its.Api.V1\xca\x02\x0b\x46its\\Api\\V1\xe2\x02\x17\x46its\\Api\\V1\\GPBMetadata\xea\x02\rFits::Api::V1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -72,28 +71,28 @@
_globals['_PROJECTSERVICE'].methods_by_name['Delete']._serialized_options = b'\312\363\030\001\001\340\363\030\001'
_globals['_PROJECTSERVICE'].methods_by_name['Update']._loaded_options = None
_globals['_PROJECTSERVICE'].methods_by_name['Update']._serialized_options = b'\312\363\030\002\001\002\340\363\030\001'
- _globals['_PROJECT']._serialized_start=167
- _globals['_PROJECT']._serialized_end=390
- _globals['_PROJECTSERVICELISTREQUEST']._serialized_start=393
- _globals['_PROJECTSERVICELISTREQUEST']._serialized_end=609
- _globals['_PROJECTSERVICELISTRESPONSE']._serialized_start=611
- _globals['_PROJECTSERVICELISTRESPONSE']._serialized_end=689
- _globals['_PROJECTSERVICEGETREQUEST']._serialized_start=691
- _globals['_PROJECTSERVICEGETREQUEST']._serialized_end=753
- _globals['_PROJECTSERVICEGETRESPONSE']._serialized_start=755
- _globals['_PROJECTSERVICEGETRESPONSE']._serialized_end=830
- _globals['_PROJECTSERVICECREATEREQUEST']._serialized_start=833
- _globals['_PROJECTSERVICECREATEREQUEST']._serialized_end=1073
- _globals['_PROJECTSERVICECREATERESPONSE']._serialized_start=1075
- _globals['_PROJECTSERVICECREATERESPONSE']._serialized_end=1153
- _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_start=1155
- _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_end=1220
- _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_start=1222
- _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_end=1300
- _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_start=1303
- _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_end=1667
- _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_start=1669
- _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_end=1747
- _globals['_PROJECTSERVICE']._serialized_start=1750
- _globals['_PROJECTSERVICE']._serialized_end=2284
+ _globals['_PROJECT']._serialized_start=134
+ _globals['_PROJECT']._serialized_end=377
+ _globals['_PROJECTSERVICELISTREQUEST']._serialized_start=380
+ _globals['_PROJECTSERVICELISTREQUEST']._serialized_end=596
+ _globals['_PROJECTSERVICELISTRESPONSE']._serialized_start=598
+ _globals['_PROJECTSERVICELISTRESPONSE']._serialized_end=676
+ _globals['_PROJECTSERVICEGETREQUEST']._serialized_start=678
+ _globals['_PROJECTSERVICEGETREQUEST']._serialized_end=740
+ _globals['_PROJECTSERVICEGETRESPONSE']._serialized_start=742
+ _globals['_PROJECTSERVICEGETRESPONSE']._serialized_end=817
+ _globals['_PROJECTSERVICECREATEREQUEST']._serialized_start=820
+ _globals['_PROJECTSERVICECREATEREQUEST']._serialized_end=1060
+ _globals['_PROJECTSERVICECREATERESPONSE']._serialized_start=1062
+ _globals['_PROJECTSERVICECREATERESPONSE']._serialized_end=1140
+ _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_start=1142
+ _globals['_PROJECTSERVICEDELETEREQUEST']._serialized_end=1207
+ _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_start=1209
+ _globals['_PROJECTSERVICEDELETERESPONSE']._serialized_end=1287
+ _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_start=1290
+ _globals['_PROJECTSERVICEUPDATEREQUEST']._serialized_end=1654
+ _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_start=1656
+ _globals['_PROJECTSERVICEUPDATERESPONSE']._serialized_end=1734
+ _globals['_PROJECTSERVICE']._serialized_start=1737
+ _globals['_PROJECTSERVICE']._serialized_end=2271
# @@protoc_insertion_point(module_scope)
diff --git a/python/fits/api/v1/project_pb2.pyi b/python/fits/api/v1/project_pb2.pyi
index 8756f92..9bcd24e 100644
--- a/python/fits/api/v1/project_pb2.pyi
+++ b/python/fits/api/v1/project_pb2.pyi
@@ -1,7 +1,6 @@
from buf.validate import validate_pb2 as _validate_pb2
from fits.api.v1 import common_pb2 as _common_pb2
from fits.api.v1 import predefined_rules_pb2 as _predefined_rules_pb2
-from google.protobuf import timestamp_pb2 as _timestamp_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
@@ -11,20 +10,22 @@ from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
DESCRIPTOR: _descriptor.FileDescriptor
class Project(_message.Message):
- __slots__ = ("uuid", "meta", "name", "description", "tenant", "avatar_url")
+ __slots__ = ("uuid", "meta", "name", "description", "tenant", "avatar_url", "slug")
UUID_FIELD_NUMBER: _ClassVar[int]
META_FIELD_NUMBER: _ClassVar[int]
NAME_FIELD_NUMBER: _ClassVar[int]
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
TENANT_FIELD_NUMBER: _ClassVar[int]
AVATAR_URL_FIELD_NUMBER: _ClassVar[int]
+ SLUG_FIELD_NUMBER: _ClassVar[int]
uuid: str
meta: _common_pb2.Meta
name: str
description: str
tenant: str
avatar_url: str
- def __init__(self, uuid: _Optional[str] = ..., meta: _Optional[_Union[_common_pb2.Meta, _Mapping]] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., tenant: _Optional[str] = ..., avatar_url: _Optional[str] = ...) -> None: ...
+ slug: str
+ def __init__(self, uuid: _Optional[str] = ..., meta: _Optional[_Union[_common_pb2.Meta, _Mapping]] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., tenant: _Optional[str] = ..., avatar_url: _Optional[str] = ..., slug: _Optional[str] = ...) -> None: ...
class ProjectServiceListRequest(_message.Message):
__slots__ = ("id", "name", "tenant", "labels")