ensure apiKey is presented to required consumers

This commit is contained in:
Rob Colbert 2026-05-10 08:25:17 -04:00
parent a4cff5be69
commit 190f424361
3 changed files with 17 additions and 9 deletions

View File

@ -63,7 +63,7 @@ export const AiProviderSchema = new Schema<IAiProvider>({
name: { type: String, required: true }, name: { type: String, required: true },
apiType: { type: String, enum: ["ollama", "openai"], required: true }, apiType: { type: String, enum: ["ollama", "openai"], required: true },
baseUrl: { type: String, required: true }, baseUrl: { type: String, required: true },
apiKey: { type: String, required: false, select: false, default: "" }, apiKey: { type: String, required: false, default: "" },
enabled: { type: Boolean, default: true, required: true }, enabled: { type: Boolean, default: true, required: true },
models: { type: [AiModelSchema], default: [], required: true }, models: { type: [AiModelSchema], default: [], required: true },
lastModelRefresh: { type: Date, default: Date.now }, lastModelRefresh: { type: Date, default: Date.now },

View File

@ -59,7 +59,7 @@ class ChatSessionService extends DtpService {
}, },
], ],
}, },
{ path: "provider" }, { path: "provider", select: "+apiKey" },
]; ];
public populateChatTurn: PopulateOptions[] = [ public populateChatTurn: PopulateOptions[] = [
{ {
@ -153,7 +153,7 @@ class ChatSessionService extends DtpService {
const session = await ChatSession.findById(chatSessionId) const session = await ChatSession.findById(chatSessionId)
.populate("user", "-passwordSalt -password") .populate("user", "-passwordSalt -password")
.populate("project") .populate("project")
.populate("provider") .populate("provider", "+apiKey")
.lean(); .lean();
if (!session) { if (!session) {
@ -170,7 +170,7 @@ class ChatSessionService extends DtpService {
const sessions = await ChatSession.find({ project: projectId }) const sessions = await ChatSession.find({ project: projectId })
.populate("user", "-passwordSalt -password") .populate("user", "-passwordSalt -password")
.populate("project") .populate("project")
.populate("provider") .populate("provider", "+apiKey")
.sort({ createdAt: -1 }) .sort({ createdAt: -1 })
.lean(); .lean();
@ -184,7 +184,7 @@ class ChatSessionService extends DtpService {
const sessions = await ChatSession.find({ user: userId }) const sessions = await ChatSession.find({ user: userId })
.populate("user", "-passwordSalt -password") .populate("user", "-passwordSalt -password")
.populate("project") .populate("project")
.populate("provider") .populate("provider", "+apiKey")
.sort({ createdAt: -1 }) .sort({ createdAt: -1 })
.lean(); .lean();
@ -395,6 +395,14 @@ class ChatSessionService extends DtpService {
const dbProvider: IAiProvider = session.provider as IAiProvider; const dbProvider: IAiProvider = session.provider as IAiProvider;
const provider: IAiApiProvider = this.mapDbProviderToConfig(dbProvider); const provider: IAiApiProvider = this.mapDbProviderToConfig(dbProvider);
if (!provider.apiKey) {
const error = new Error(
`Provider "${provider.name}" (${provider._id}) has no apiKey configured`,
);
error.statusCode = 400;
throw error;
}
this.log.info("calling provider to generate chat session title", { this.log.info("calling provider to generate chat session title", {
provider: { provider: {
_id: provider._id, _id: provider._id,

View File

@ -104,10 +104,10 @@ class SessionService extends DtpService {
const user = await UserService.getById(userId); const user = await UserService.getById(userId);
return user; return user;
} catch (cause) { } catch (cause) {
this.log.error("failed to verify JSON Web Token", { // this.log.error("failed to verify JSON Web Token", {
token, // token,
error: cause, // error: cause,
}); // });
const error = new Error("Invalid JSON Web Token", { cause }); const error = new Error("Invalid JSON Web Token", { cause });
error.name = "TokenVerifyError"; error.name = "TokenVerifyError";
error.statusCode = 401; error.statusCode = 401;